Question Ajouter une colonne de clé primaire dans la table SQL


Je suis étudiant en RDBMS.

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

  • Drop Column 'RowId' s'il existe.
  • Drop contraint s'il existe.
  • Ajoutez une nouvelle colonne 'RowId' dans la table.
  • Rendre cette colonne comme clé primaire.
  • Autoincrement type int.

15
2018-02-06 10:14


origine


Réponses:


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 script. dbo.YourTable en utilisant des contraintes de clé étrangère sur le pré-existant RowId colonne...

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


39
2018-02-06 10:23



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

  • Ajouter une nouvelle colonne (note: vous ne pouvez avoir qu'une seule colonne IDENTITY par table)
  • Abandonner l'ancienne clé primaire
  • Ajouter une nouvelle clé primaire
  • Déposez 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, alors utilisez DBCC CHECKIDENT


7
2018-02-06 10:25



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

Vous pouvez ajouter une nouvelle colonne IDENTITY (autonumber) et en faire la clé primaire dans une seule déclaration:

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

Je préfère ne pas m'embêter avec des noms de contraintes quand cela n'aide pas.

Vous pouvez spécifier la graine (et incrément) valeurs entre parenthèses après le IDENTITY mot-clé.


2
2017-12-14 16:36