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.


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.


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)

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)

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);

3

Dans Oracle :

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

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


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)


1

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


1

Pour DB2, la syntaxe est:

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

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);

0

Essaye ça:

ALTER TABLE product
ADD FOREIGN KEY (product_ID) REFERENCES product(product_ID);

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.