160 votes

Ajouter une nouvelle colonne avec une contrainte de clé étrangère en une seule commande

J'essaie d'ajouter une nouvelle colonne qui sera une clé étrangère. J'ai pu ajouter la colonne et la contrainte de clé étrangère à l'aide de deux fichiers distincts. ALTER TABLE des commandes :

ALTER TABLE one
ADD two_id integer;

ALTER TABLE one
ADD FOREIGN KEY (two_id) REFERENCES two(id);

Existe-t-il un moyen de faire cela avec une commande ALTER TABLE au lieu de deux ? Je n'ai rien trouvé qui fonctionne.

3 votes

221voto

Jonathan Leffler Points 299946

Comme souvent avec les questions liées à SQL, cela dépend du SGBD. Certains SGBD vous permettent de combiner ALTER TABLE des opérations séparées par des virgules. Par exemple...

Informix la syntaxe :

ALTER TABLE one
    ADD two_id INTEGER,
    ADD CONSTRAINT FOREIGN KEY(two_id) REFERENCES two(id);

La syntaxe pour IBM DB2 LUW est similaire, répétant le mot clé ADD mais (si je lis correctement le diagramme) ne nécessitant pas de virgule pour séparer les éléments ajoutés.

Microsoft SQL Server la syntaxe :

ALTER TABLE one
    ADD two_id INTEGER,
    FOREIGN KEY(two_id) REFERENCES two(id);

D'autres ne vous permettent pas de combiner ALTER TABLE des opérations de ce genre. Le langage SQL standard n'autorise qu'une seule opération dans le champ ALTER TABLE donc, en SQL standard, il faut procéder en deux étapes.

5 votes

Deuxième ajout et contrainte.

28 votes

Pour la partie SQL, pour donner un nom à la contrainte, vous l'écrivez comme ceci : ALTER TABLE [Messages] ADD [AlertTriggerID] BIGINT NULL, CONSTRAINT FK_Messages_AlertTriggers FOREIGN KEY (AlertTriggerID) REFERENCES AlertTriggers (AlertTriggerID) ;

0 votes

102voto

sqladmin Points 603

Dans MS-SQLServer :

ALTER TABLE one
ADD two_id integer CONSTRAINT fk FOREIGN KEY (two_id) REFERENCES two(id)

0 votes

Je ne pense pas que la question ait besoin d'être clarifiée, puisque la réponse acceptée indique déjà qu'il y a une grande différence entre les moteurs DB dans la façon de procéder, ce qui doit être clarifié est votre réponse, donc je l'ai fait.

14 votes

A vous de nommer votre contrainte. La réponse acceptée laisse le système générer le nom, ce qui est glauque et difficile à gérer par la suite.

18voto

Sandeep Badikolu Points 171

En MS SQL SERVER :

Avec un nom de clé étrangère défini par l'utilisateur

ALTER TABLE tableName
ADD columnName dataType,
CONSTRAINT fkName FOREIGN KEY(fkColumnName) 
   REFERENCES pkTableName(pkTableColumnName);

Sans nom de clé étrangère défini par l'utilisateur

ALTER TABLE tableName
ADD columnName dataType,
FOREIGN KEY(fkColumnName) REFERENCES pkTableName(pkTableColumnName);

17voto

jausel Points 396

Pour SQL Server, cela devrait être quelque chose comme

ALTER TABLE one
ADD two_id integer constraint fk foreign key references two(id)

5voto

O.Badr Points 21

En Oracle :

ALTER TABLE one ADD two_id INTEGER CONSTRAINT Fk_two_id REFERENCES two(id);

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