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

128

J'essaye 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 ALTER TABLEcommandes distinctes :

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 ne pouvais rien trouver qui fonctionne.

champignon
la source

Réponses:

185

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

Syntaxe Informix :

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

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

Syntaxe de Microsoft SQL Server :

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

Certains autres ne vous permettent pas de combiner des opérations ALTER TABLE comme ça. Le SQL standard n'autorise qu'une seule opération dans l'instruction ALTER TABLE, donc en SQL standard, elle doit être effectuée en deux étapes.

Jonathan Leffler
la source
5
Deuxième ajout et contrainte.
Imran
18
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);
Dragos Durlut
78

Dans MS-SQLServer:

ALTER TABLE one
ADD two_id integer CONSTRAINT fk FOREIGN KEY (two_id) REFERENCES two(id)
sqladmin
la source
pour quel moteur DB est-ce?
knocte le
@knocte c'est pour le serveur ms sql - la question est maintenant étiquetée pour clarifier cela
sqladmin
Je ne pense pas que la question ait besoin d'être clarifiée, car 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 le faire, ce qui doit être clarifié est votre réponse, alors je viens de le faire
knocte
9
Pour nommer votre contrainte. La réponse acceptée permet au système de générer le nom, ce qui est difficile à gérer plus tard.
Derpy
17

Pour SQL Server, cela devrait être quelque chose comme

ALTER TABLE one
ADD two_id integer constraint fk foreign key references two(id)
Jausel
la source
1
C'est un peu plus concis que les autres réponses.
Sam
11

Dans MS SQL SERVER:

Avec le 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);
Sandeep Badikolu
la source
3

Dans Oracle :

ALTER TABLE one ADD two_id INTEGER CONSTRAINT Fk_two_id REFERENCES two(id);
O.Badr
la source
2

Mise à jour 2020

C'est une question assez ancienne mais les gens y reviennent encore, je vois. Si les réponses ci-dessus ne vous ont pas aidé, assurez-vous que vous utilisez le même type de données pour la nouvelle colonne que l'ID de l'autre table.

Dans mon cas, j'utilisais Laravel et j'utilise "entier non signé" pour tous mes identifiants car il ne sert à rien d'avoir un id négatif LOL.

Donc, pour cela, la requête SQL brute changera comme ceci:

ALTER TABLE `table_name`
ADD `column_name` INTEGER UNSIGNED,
ADD CONSTRAINT constrain_name FOREIGN KEY(column_name) REFERENCES foreign_table_name(id);

J'espère que ça aide

Apprenant
la source
1
"ADD CONSTRAINT" devrait être simplement "CONTRAINT", oui?
TimH
1

Vous pouvez le faire comme ci-dessous dans SQL Server

ALTER TABLE one
ADD two_id int foreign key
REFERENCES two(id)
user2010014
la source
1

DLL PostgreSQL pour ajouter une colonne FK:

ALTER TABLE one
ADD two_id INTEGER REFERENCES two;
Kshitij Bajracharya
la source
1

ALTER TABLE TableName ADD NewColumnName INTEGER, FOREIGN KEY(NewColumnName) REFERENCES [ForeignKey_TableName](Foreign_Key_Column)

Arsman Ahmad
la source
1

Pour DB2, la syntaxe est:

ALTER TABLE one ADD two_id INTEGER FOREIGN KEY (two_id) REFERENCES two (id);
Dan B.
la source
0

Si vous devez également ajouter des valeurs par défaut au cas où vous auriez déjà des lignes dans la table, ajoutez DEFAULT val

ALTER TABLE one
ADD two_id int DEFAULT 123,
FOREIGN KEY(two_id) REFERENCES two(id);
iMalek
la source
0

Essaye ça:

ALTER TABLE product
ADD FOREIGN KEY (product_ID) REFERENCES product(product_ID);
Michael Alavanyo
la source
1
Bienvenue à SO! S'il vous plaît, commentez vos réponses quand elles ne sont que du code. Dans votre cas, il existe de nombreuses réponses assez similaires aux vôtres, alors exposez les avantages des vôtres.
David García Bodego