Cela devient compliqué avec les contraintes de clés étrangères et primaires. Voici donc quelques scripts pour vous aider dans votre démarche :
Tout d'abord, créez une colonne dupliquée avec un nom temporaire :
alter table yourTable add tempId int NOT NULL default -1;
update yourTable set tempId = id;
Ensuite, obtenez le nom de votre contrainte de clé primaire :
SELECT * FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE TABLE_NAME = 'yourTable';
Essayez maintenant de supprimer la contrainte de clé primaire pour votre colonne :
ALTER TABLE yourTable DROP CONSTRAINT PK_yourTable_id;
Si vous avez des clés étrangères, cela va échouer, donc si c'est le cas, laissez tomber les contraintes de clés étrangères. GARDEZ LA TRACE DES TABLES POUR LESQUELLES VOUS EXÉCUTEZ CETTE OPÉRATION AFIN DE POUVOIR RAJOUTER LES CONTRAINTES PLUS TARD !!!
SELECT * FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE TABLE_NAME = 'otherTable';
alter table otherTable drop constraint fk_otherTable_yourTable;
commit;
..
Une fois que toutes vos contraintes de clé étrangère ont été supprimées, vous pourrez supprimer la contrainte PK, abandonner cette colonne, renommer votre colonne temporaire et ajouter la contrainte PK à cette colonne :
ALTER TABLE yourTable DROP CONSTRAINT PK_yourTable_id;
alter table yourTable drop column id;
EXEC sp_rename 'yourTable.tempId', 'id', 'COLUMN';
ALTER TABLE yourTable ADD CONSTRAINT PK_yourTable_id PRIMARY KEY (id)
commit;
Enfin, ajoutez à nouveau les contraintes du FK :
alter table otherTable add constraint fk_otherTable_yourTable foreign key (yourTable_id) references yourTable(id);
..
El Fin !
1 votes
Pouvez-vous afficher le schéma de la table ici ?
1 votes
Je suis sûr qu'il y a d'excellentes raisons pour que SQL Server ne prenne pas en charge la suppression d'une propriété d'identité d'une colonne via une simple instruction ALTER TABLE ..., mais cela me rend néanmoins triste actuellement que ce soit le cas.