Comment puis-je modifier une contrainte de clé primaire à l'aide de la syntaxe SQL?

100

J'ai une table qui manque une colonne dans sa contrainte de clé primaire. Au lieu de le modifier via SQL Server, je souhaite le mettre dans un script pour l'ajouter dans nos scripts de mise à jour.

Quelle syntaxe puis-je utiliser pour cela? Dois-je supprimer et recréer la contrainte de clé?

Jason
la source
5
AFAIK oui, vous devez supprimer et recréer la contrainte PK. Je ne me souviens d'aucune commande pour ajouter une colonne à une contrainte PK / FK déjà existante.
Seramme

Réponses:

149

Oui. Le seul moyen serait de supprimer la contrainte avec une table Alter puis de la recréer.

ALTER TABLE <Table_Name>
DROP CONSTRAINT <constraint_name>

ALTER TABLE <Table_Name>
ADD CONSTRAINT <constraint_name> PRIMARY KEY (<Column1>,<Column2>)
darnir
la source
11
Si vous ne connaissez pas le nom de la contrainte de clé primaire, utilisez la requête trouvée ici pour le rechercher (ou recherchez et supprimez tout en même temps). http://stackoverflow.com/a/13948609/945875
Justin
si ce n'était pas clair, ou si quelqu'un d'autre fait la même erreur, le nom de la contrainte ne peut pas être entre guillemets alter table PatientsInfo drop constraint PK__Patients__1CBB51380A338187fonctionne ici
Maslow
1
Pour ceux d'entre vous, ne connaissant pas le nom de la contrainte: ALTER TABLE db. table DROP PRIMARY KEY, AJOUT PRIMARY KEY ( id1, id2);
karsten314159
21

PRIMARY KEY CONSTRAINTne peut pas être modifié, vous ne pouvez que le supprimer et le créer à nouveau. Pour les grands ensembles de données, cela peut entraîner une longue durée d'exécution et donc une indisponibilité de la table.

Oleg Dok
la source
3

En termes de performances, il est inutile de conserver les index non clusterisés pendant ce temps, car ils seront remis à jour lors de la suppression et de la création. S'il s'agit d'un ensemble de données volumineuses, vous devriez envisager de renommer la table (si possible, des paramètres de sécurité dessus?), Recréer une table vide avec les clés appropriées pour y migrer toutes les données. Vous devez vous assurer que vous disposez de suffisamment d'espace pour cela.

Oky
la source
3

Dans mon cas, je souhaite ajouter une colonne à une clé primaire (colonne4). J'ai utilisé ce script pour ajouter column4

ALTER TABLE TableA
DROP CONSTRAINT [PK_TableA]

ALTER TABLE TableA
ADD CONSTRAINT [PK_TableA] PRIMARY KEY (
    [column1] ASC,
    [column2] ASC, 
    [column3] ASC,
    [column4] ASC
)
MNF
la source
-4

vous pouvez renommer les objets de contrainte à l'aide de sp_rename (comme décrit dans cette réponse )

par exemple:

EXEC sp_rename N'schema.MyIOldConstraint', N'MyNewConstraint'
Garrett Taiji
la source
3
La question était de savoir comment changer la contrainte, c'est-à-dire AJOUTER une colonne, pas comment renommer.
Andrew Steitz