it-swarm.asia

إضافة المفتاح الأساسي إلى الجدول الحالي

لدي جدول حالي يسمى Persion. في هذا الجدول لدي 5 أعمدة:

  • persionId
  • Pname
  • PMID
  • Pdescription
  • Pamt

عندما أنشأت هذا الجدول ، قمت بتعيين PersionId و Pname كـ المفتاح الأساسي .

أريد الآن تضمين عمود آخر في المفتاح الأساسي - PMID. كيف يمكنني كتابة عبارة ALTER للقيام بذلك؟ (لدي بالفعل 1000 سجل في الجدول)

156
jay

إسقاط القيد وإعادة إنشائها

alter table Persion drop CONSTRAINT <constraint_name>

alter table Persion add primary key (persionId,Pname,PMID)

تصحيح:

يمكنك العثور على اسم القيد باستخدام الاستعلام أدناه:

select OBJECT_NAME(OBJECT_ID) AS NameofConstraint
FROM sys.objects
where OBJECT_NAME(parent_object_id)='Persion'
and type_desc LIKE '%CONSTRAINT'
161
Joe G Joseph

أعتقد أن شيئا مثل هذا يجب أن تعمل

-- drop current primary key constraint
ALTER TABLE dbo.persion 
DROP CONSTRAINT PK_persionId;
GO

-- add new auto incremented field
ALTER TABLE dbo.persion 
ADD pmid BIGINT IDENTITY;
GO

-- create new primary key constraint
ALTER TABLE dbo.persion 
ADD CONSTRAINT PK_persionId PRIMARY KEY NONCLUSTERED (pmid, persionId);
GO
62
T I
-- create new primary key constraint
ALTER TABLE dbo.persion 
ADD CONSTRAINT PK_persionId PRIMARY KEY NONCLUSTERED (pmid, persionId);

هو حل أفضل لأنك تتحكم في تسمية المفتاح الأساسي.


إنه أفضل من مجرد استخدام

ALTER TABLE Persion ADD PRIMARY KEY(persionId,Pname,PMID)

الذي يصف أسماء عشوائية ويمكن أن يسبب مشاكل عند البرمجة أو مقارنة قواعد البيانات

27
user3675542

إذا قمت بإضافة قيد المفتاح الأساسي

ALTER TABLE <TABLE NAME> ADD CONSTRAINT <CONSTRAINT NAME> PRIMARY KEY <COLUMNNAME>  

فمثلا:

ALTER TABLE DEPT ADD CONSTRAINT PK_DEPT PRIMARY KEY (DEPTNO)
23
K GANGA

يعرّف القيد PRIMARY KEY بشكل فريد كل سجل في جدول قاعدة بيانات. يجب أن تحتوي المفاتيح الأساسية على قيم فريدة ولا يمكن أن يحتوي العمود على قيم فارغة.

  -- DROP current primary key 
  ALTER TABLE tblPersons DROP CONSTRAINT <constraint_name>
  Example:
  ALTER TABLE tblPersons 
  DROP CONSTRAINT P_Id;


  -- ALTER TABLE tblpersion
  ALTER TABLE tblpersion add primary key (P_Id,LastName)
4
Mike Clark

Necromancing.
فقط في حال كان لدى أي شخص مخطط جيد للعمل معه مثلي ...
إليك كيفية القيام بذلك بشكل صحيح:

في هذا المثال ، اسم الجدول هو dbo.T_SYS_Language_Forms ، واسم العمود هو LANG_UID

-- First, chech if the table exists...
IF 0 < (
    SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES 
    WHERE TABLE_TYPE = 'BASE TABLE'
    AND TABLE_SCHEMA = 'dbo'
    AND TABLE_NAME = 'T_SYS_Language_Forms'
)
BEGIN
    -- Check for NULL values in the primary-key column
    IF 0 = (SELECT COUNT(*) FROM T_SYS_Language_Forms WHERE LANG_UID IS NULL)
    BEGIN
        ALTER TABLE T_SYS_Language_Forms ALTER COLUMN LANG_UID uniqueidentifier NOT NULL 

        -- No, don't drop, FK references might already exist...
        -- Drop PK if exists (it is very possible it does not have the name you think it has...)
        -- ALTER TABLE T_SYS_Language_Forms DROP CONSTRAINT pk_constraint_name 
        --DECLARE @pkDropCommand nvarchar(1000) 
        --SET @pkDropCommand = N'ALTER TABLE T_SYS_Language_Forms DROP CONSTRAINT ' + QUOTENAME((SELECT CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
        --WHERE CONSTRAINT_TYPE = 'PRIMARY KEY' 
        --AND TABLE_SCHEMA = 'dbo' 
        --AND TABLE_NAME = 'T_SYS_Language_Forms' 
        ----AND CONSTRAINT_NAME = 'PK_T_SYS_Language_Forms' 
        --))
        ---- PRINT @pkDropCommand 
        --EXECUTE(@pkDropCommand) 
        -- Instead do
        -- EXEC sp_rename 'dbo.T_SYS_Language_Forms.PK_T_SYS_Language_Forms1234565', 'PK_T_SYS_Language_Forms';

        -- Check if they keys are unique (it is very possible they might not be)        
        IF 1 >= (SELECT TOP 1 COUNT(*) AS cnt FROM T_SYS_Language_Forms GROUP BY LANG_UID ORDER BY cnt DESC)
        BEGIN

            -- If no Primary key for this table
            IF 0 =  
            (
                SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
                WHERE CONSTRAINT_TYPE = 'PRIMARY KEY' 
                AND TABLE_SCHEMA = 'dbo' 
                AND TABLE_NAME = 'T_SYS_Language_Forms' 
                -- AND CONSTRAINT_NAME = 'PK_T_SYS_Language_Forms' 
            )
                ALTER TABLE T_SYS_Language_Forms ADD CONSTRAINT PK_T_SYS_Language_Forms PRIMARY KEY CLUSTERED (LANG_UID ASC)
            ;

        END -- End uniqueness check
        ELSE
            PRINT 'FSCK, this column has duplicate keys, and can thus not be changed to primary key...' 
    END -- End NULL check
    ELSE
        PRINT 'FSCK, need to figure out how to update NULL value(s)...' 
END 
3
Stefan Steiger

يرجى المحاولة

ALTER TABLE TABLE_NAME DROP INDEX `PRIMARY`, ADD PRIMARY KEY (COLUMN1, COLUMN2,..);
2
Samir

يوجد بالفعل مفتاح أساسي في الجدول الخاص بك. لا يمكنك فقط إضافة المفتاح الأساسي ، وإلا فسوف يتسبب في حدوث خطأ. لأنه يوجد مفتاح أساسي لجدول sql.

أولاً ، عليك إسقاط المفتاح الأساسي القديم.

الخلية:

ALTER TABLE Persion
DROP PRIMARY KEY;

SQL Server/Oracle/MS Access:

ALTER TABLE Persion
DROP CONSTRAINT 'constraint name';

يجب عليك العثور على اسم القيد في الجدول الخاص بك. إذا كنت قد منحت اسم القيد عند إنشاء جدول ، فيمكنك بسهولة استخدام اسم القيد (على سبيل المثال: PK_Persion).

ثانيا ، إضافة المفتاح الأساسي.

MySQL/SQL Server/Oracle/MS Access:

ALTER TABLE Persion ADD PRIMARY KEY (PersionId,Pname,PMID);

أو أفضل واحد أدناه

ALTER TABLE Persion ADD CONSTRAINT PK_Persion PRIMARY KEY (PersionId,Pname,PMID);

هذا يمكن أن يحدد اسم القيد من قبل المطور. من السهل الحفاظ على الطاولة.

لقد ارتبكت قليلاً عندما نظرت إلى كل الإجابات. لذلك أنا ابحث عن وثيقة للعثور على كل التفاصيل. نأمل أن تساعد هذه الإجابة المبتدئين SQL أخرى.

المرجع: https://www.w3schools.com/sql/sql_primarykey.asp

2
劉鎮瑲
ALTER TABLE TABLE_NAME ADD PRIMARY KEY(`persionId`,`Pname`,`PMID`)
1
Harry Singh

حاول استخدام هذا الرمز:

ALTER TABLE `table name` 
    CHANGE COLUMN `column name` `column name` datatype NOT NULL, 
    ADD PRIMARY KEY (`column name`) ;
1
Rekha Rajan