web-dev-qa-db-fra.com

Ajouter une clé primaire à la table existante

J'ai une table existante appelée Persion. Dans ce tableau, j'ai 5 colonnes:

  • persionId
  • Pname
  • PMid
  • Description
  • Pamt

Lorsque j'ai créé cette table, j'ai défini PersionId et Pname comme clé primaire.

Je veux maintenant inclure une colonne de plus dans la clé primaire - PMID. Comment puis-je écrire une instruction ALTER pour le faire? (J'ai déjà 1000 enregistrements dans la table)

166
jay

déposer la contrainte et la recréer

alter table Persion drop CONSTRAINT <constraint_name>

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

modifier:

vous pouvez trouver le nom de la contrainte en utilisant la requête ci-dessous:

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

Je pense que quelque chose comme ça devrait marcher

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

est une meilleure solution car vous avez le contrôle sur la dénomination de la clé primaire.


C'est mieux que de simplement utiliser

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

quels noms sont aléatoires et peuvent poser des problèmes lors de la création de scripts ou de la comparaison de bases de données

29
user3675542

Si vous ajoutez une contrainte de clé primaire

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

par exemple:

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

Il y a déjà une clé primaire dans votre table. Vous ne pouvez pas simplement ajouter une clé primaire, sinon cela provoquerait une erreur. Car il existe une clé primaire pour la table SQL.

Tout d'abord, vous devez supprimer votre ancienne clé primaire.

MySQL:

ALTER TABLE Persion
DROP PRIMARY KEY;

SQL Server/Oracle/MS Access:

ALTER TABLE Persion
DROP CONSTRAINT 'constraint name';

Vous devez trouver le nom de la contrainte dans votre table. Si vous aviez donné le nom de la contrainte lors de la création de la table, vous pouvez facilement utiliser le nom de la contrainte (ex: PK_Persion).

Deuxièmement, Ajouter une clé primaire.

MySQL/SQL Server/Oracle/MS Access:

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

ou le meilleur ci-dessous

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

Cela peut définir le nom de contrainte par développeur. C'est plus facile de maintenir la table.

Je suis un peu confus quand j'ai regardé toutes les réponses. Je recherche donc un document pour trouver chaque détail. J'espère que cette réponse pourra aider d'autres débutants en SQL.

Référence: https://www.w3schools.com/sql/sql_primarykey.asp

5
劉鎮瑲

La contrainte PRIMARY KEY identifie de manière unique chaque enregistrement d'une table de base de données. Les clés primaires doivent contenir des valeurs UNIQUES et la colonne ne peut pas contenir de valeurs NULL.

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

Nécromancie.
Juste au cas où quelqu'un aurait un aussi bon schéma pour travailler que moi ...
Voici comment le faire correctement:

Dans cet exemple, le nom de la table est dbo.T_SYS_Language_Forms et le nom de la colonne est 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

S'il vous plaît essayer ceci-

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

Essayez d'utiliser ce code:

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