it-swarm.com.de

Hinzufügen eines Primärschlüssels zu einer vorhandenen Tabelle

Ich habe eine vorhandene Tabelle mit dem Namen Persion. In dieser Tabelle habe ich 5 Spalten:

  • persionId
  • Pname
  • PMid
  • Beschreibung
  • Pamt

Bei der Erstellung dieser Tabelle habe ich PersionId und Pname als Primärschlüssel festgelegt.

Ich möchte jetzt eine weitere Spalte in den Primärschlüssel aufnehmen - PMID. Wie kann ich dazu eine ALTER -Anweisung schreiben? (Ich habe bereits 1000 Datensätze in der Tabelle)

166
jay

drop constraint und erstelle es neu

alter table Persion drop CONSTRAINT <constraint_name>

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

bearbeiten:

sie können den Namen der Einschränkung mithilfe der folgenden Abfrage ermitteln:

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

Ich denke so etwas sollte funktionieren

-- 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
65
T I
-- create new primary key constraint
ALTER TABLE dbo.persion 
ADD CONSTRAINT PK_persionId PRIMARY KEY NONCLUSTERED (pmid, persionId);

ist eine bessere Lösung, da Sie die Benennung des Primärschlüssels steuern können.


Es ist besser als nur zu benutzen

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

dies führt zu zufälligen Namen und kann zu Problemen beim Auslesen von Skripten oder Vergleichen von Datenbanken führen

29
user3675542

Wenn Sie eine Primärschlüsseleinschränkung hinzufügen

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

zum Beispiel:

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

In Ihrer Tabelle befindet sich bereits ein Primärschlüssel. Sie können nicht einfach einen Primärschlüssel hinzufügen, da dies sonst zu Fehlern führt. Weil es einen Primärschlüssel für die SQL-Tabelle gibt.

Zuerst müssen Sie Ihren alten Primärschlüssel löschen.

MySQL:

ALTER TABLE Persion
DROP PRIMARY KEY;

SQL Server/Oracle/MS Access:

ALTER TABLE Persion
DROP CONSTRAINT 'constraint name';

Sie müssen den Namen der Einschränkung in Ihrer Tabelle finden. Wenn Sie beim Erstellen der Tabelle den Namen der Einschränkung angegeben haben, können Sie den Namen der Einschränkung problemlos verwenden (z. B .: PK_Persion).

Zweitens Primärschlüssel hinzufügen.

MySQL/SQL Server/Oracle/MS Access:

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

oder die bessere unten

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

Hiermit kann der Name der Einschränkung vom Entwickler festgelegt werden. Es ist einfacher, den Tisch zu pflegen.

Ich bin etwas verwirrt, als ich alle Antworten gelesen habe. Also recherchiere ich ein Dokument, um jedes Detail zu finden. Hoffe, diese Antwort kann anderen SQL-Anfängern helfen.

Referenz: https://www.w3schools.com/sql/sql_primarykey.asp

5
劉鎮瑲

Die PRIMARY KEY-Einschränkung identifiziert jeden Datensatz in einer Datenbanktabelle eindeutig. Primärschlüssel müssen EINZIGARTIGE Werte enthalten, und die Spalte darf keine NULL-Werte enthalten.

  -- 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

Nekromanzierung.
Nur für den Fall, dass jemand ein so gutes Schema hat wie ich ...
So machen Sie es richtig:

In diesem Beispiel lautet der Tabellenname dbo.T_SYS_Language_Forms und der Spaltenname 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

Bitte versuchen Sie dies-

ALTER TABLE TABLE_NAME DROP INDEX `PRIMARY`, ADD PRIMARY KEY (COLUMN1, COLUMN2,..);
2
Samir
ALTER TABLE TABLE_NAME ADD PRIMARY KEY(`persionId`,`Pname`,`PMID`)
1
Harry Singh

Versuchen Sie es mit diesem Code:

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