web-dev-qa-db-fra.com

Ajouter une colonne de clé primaire dans la table SQL

Je suis étudiant en RDBMS.

J'ai une question très basique, disons que j'ai une table existante dans SQL Server. Quel sera le script pour modifier la table.

  • Supprimez la colonne 'RowId' si elle existe.
  • Laissez tomber la contraint si elle existe.
  • Ajoutez une nouvelle colonne "RowId" dans le tableau.
  • Faites de cette colonne la clé primaire.
  • Type d'auto-incrémentation int.
17
SOF User

Dans SQL Server 2005 ou version ultérieure, vous pouvez utiliser ce script:

-- drop PK constraint if it exists
IF EXISTS (SELECT * FROM sys.key_constraints WHERE type = 'PK' AND parent_object_id = OBJECT_ID('dbo.YourTable') AND Name = 'PK_YourTable')
   ALTER TABLE dbo.YourTable
   DROP CONSTRAINT PK_YourTable
GO

-- drop column if it already exists
IF EXISTS (SELECT * FROM sys.columns WHERE Name = 'RowId' AND object_id = OBJECT_ID('dbo.YourTable'))
    ALTER TABLE dbo.YourTable DROP COLUMN RowId
GO

-- add new "RowId" column, make it IDENTITY (= auto-incrementing)
ALTER TABLE dbo.YourTable 
ADD RowId INT IDENTITY(1,1)
GO

-- add new primary key constraint on new column   
ALTER TABLE dbo.YourTable 
ADD CONSTRAINT PK_YourTable
PRIMARY KEY CLUSTERED (RowId)
GO

Bien sûr, ce script peut toujours échouer si d'autres tables font référence à ce dbo.YourTable en utilisant des contraintes de clé étrangère sur la colonne RowId préexistante ...

Mise à jour: et bien sûr, partout où j'utilise dbo.YourTable ou PK_YourTable, vous devez remplacer ces espaces réservés par les noms de table/contrainte réels de votre propre base de données (vous n'avez pas mentionné ce qu'ils étaient, dans votre question .....)

44
marc_s

Remarque: cette réponse a été ajoutée avant la mise à jour des questions

  • Ajouter une nouvelle colonne (remarque: vous ne pouvez avoir qu'une seule colonne IDENTITY par table)
  • Supprimer l'ancienne clé primaire
  • Ajouter une nouvelle clé primaire
  • Supprimer l'ancienne colonne si nécessaire

Exemple de script:

CREATE TABLE whatever (
     OldPKColumn uniqueidentifier NOT NULL, 
     CONSTRAINT PK_whatever PRIMARY KEY (OldPKColumn)
    )

ALTER TABLE whatever
    ADD RowId int NOT NULL IDENTITY (1,1);

ALTER TABLE whatever
    DROP CONSTRAINT PK_whatever;

ALTER TABLE whatever WITH CHECK
    ADD CONSTRAINT PK_whatever PRIMARY KEY CLUSTERED (RowId);

ALTER TABLE whatever
    DROP COLUMN oldPKcolumn;

Et une pensée aléatoire ... essayez-vous de réinitialiser une colonne IDENTITY?
Si oui, utilisez alors DBCC CHECKIDENT

8
gbn

Juste un commentaire pour améliorer ces bonnes réponses (je ne peux pas encore utiliser les commentaires - je suis à un point de réputation de ce privilège) et comme référence future pour moi-même:

Une nouvelle colonne IDENTITY (numéro automatique) peut être ajoutée et transformée en clé primaire dans une seule instruction:

ALTER TABLE [TableName] ADD [ColumnName] int IDENTITY PRIMARY KEY;

Je préfère ne pas me soucier des noms de contraintes lorsque cela n'aide pas.

Vous pouvez spécifier des valeurs seed (et increment) entre parenthèses après le mot clé IDENTITY.

3
bitoolean