31 votes

Définir la colonne comme clé primaire si la table n'a pas de clé primaire.

J'ai une colonne dans la base de données qui a 5 colonnes mais pas de clé primaire. L'une des colonnes s'appelle myTable_id et est un nombre entier.

Je veux vérifier si la table a une colonne de clé primaire. Si ce n'est pas le cas, alors faire de myTable_id une colonne clé primaire et en faire une colonne identité. Existe-t-il un moyen de faire cela ?

J'ai essayé avec ça :

ALTER TABLE Persons
DROP CONSTRAINT pk_PersonID

ALTER TABLE Persons
ADD PRIMARY KEY (P_Id)

et j'obtiens une erreur de syntaxe dans Management studio.

50voto

Urban Björkman Points 1455

Ceci vérifie si la clé primaire existe, sinon elle est créée.

IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
WHERE CONSTRAINT_TYPE = 'PRIMARY KEY' AND TABLE_NAME = 'Persons' 
AND TABLE_SCHEMA ='dbo')
BEGIN
   ALTER TABLE Persons ADD CONSTRAINT pk_PersonID PRIMARY KEY (P_Id)
END
ELSE
BEGIN
   -- Key exists
END

violon : http://sqlfiddle.com/#!6/e165d/2

7voto

Cris Points 2561
ALTER TABLE Persons
ADD CONSTRAINT pk_PersonID PRIMARY KEY (P_Id)

3voto

Fletch Points 365

Un site IDENTITY contrainte ne peut pas être ajoutée à une colonne existante Vous devez donc commencer par réfléchir à la manière dont vous allez ajouter ces éléments. Il existe deux options :

  1. Créez une nouvelle table incluant une clé primaire avec identité et supprimez la table existante.
  2. Créez une nouvelle colonne clé primaire avec identité et supprimez la colonne 'P_ID' existante.

Il existe une troisième voie, qui est une meilleure approche pour les très grandes tables via l'option ALTER TABLE...SWITCH déclaration. Voir Ajout d'un IDENTITY à une colonne existante pour un exemple de chacun. En réponse à cette question, si le tableau n'est pas trop grand, je recommande d'exécuter ce qui suit :

-- Check that the table/column exist and no primary key is already on the table. 
IF COL_LENGTH('PERSONS','P_ID') IS NOT NULL
   AND NOT EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
                   WHERE CONSTRAINT_TYPE = 'PRIMARY KEY' AND TABLE_NAME = 'PERSONS')
                   -- Add table schema to the WHERE clause above e.g. AND TABLE_SCHEMA ='dbo'
BEGIN
    ALTER TABLE PERSONS    
    ADD P_ID_new int IDENTITY(1, 1)
    GO

    ALTER TABLE PERSONS 
    DROP COLUMN P_ID
    GO

    EXEC sp_rename 'PERSONS.P_ID_new', 'P_ID', 'Column'
    GO

    ALTER TABLE PERSONS 
    ADD CONSTRAINT PK_P_ID PRIMARY KEY CLUSTERED (P_ID)
    GO
END

Notas: En utilisant explicitement l'option CONSTRAINT la contrainte de clé primaire reçoit un nom particulier plutôt que de dépendre de SQL Server pour attribuer automatiquement un nom.

N'inclure que CLUSTERED sur le PRIMARY KEY si l'équilibre entre les recherches pour un P_ID particulier et la quantité d'écriture l'emporte sur les avantages d'un regroupement de la table par un autre index. Voir Créer SQL IDENTITY comme PRIMARY KEY .

2voto

Iswanto San Points 7499

Vous pouvez vérifier si la clé primaire existe ou non en utilisant PROPRIÉTÉ DE L'OBJET Transact SQL, utilisez 'TableHasPrimaryKey' pour les seconds arguments.

DECLARE @ISHASPRIMARYKEY INT;

SELECT @ISHASPRIMARYKEY = OBJECTPROPERTY(OBJECT_ID('PERSONS'), 'TABLEHASPRIMARYKEY');
IF @ISHASPRIMARYKEY IS NULL 
BEGIN
   -- generate identity column
   ALTER TABLE PERSONS
   DROP COLUMN P_ID;

   ALTER TABLE PERSONS
   ADD P_ID INT IDENTITY(1,1);

   -- add primary key
   ALTER TABLE PERSONS
   ADD CONSTRAINT PK_PERSONID PRIMARY KEY (P_ID);

END;

0voto

Raghavan Points 647

Je ne pense pas que vous puissiez le faire. Pour transformer une colonne en une colonne d'identité, je pense que vous devez abandonner la table entièrement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X