Agregue una nueva columna con restricción de clave externa en un comando

128

Estoy tratando de agregar una nueva columna que será una clave foránea. He podido agregar la columna y la restricción de clave externa usando dos ALTER TABLEcomandos separados :

ALTER TABLE one
ADD two_id integer;

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

¿Hay alguna manera de hacer esto con un comando ALTER TABLE en lugar de dos? No se me ocurrió nada que funcione.

seta
fuente

Respuestas:

185

Como suele ocurrir con las preguntas relacionadas con SQL, depende del DBMS. Algunos DBMS le permiten combinar operaciones de tabla ALTER separadas por comas. Por ejemplo...

Sintaxis de Informix :

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

La sintaxis para IBM DB2 LUW es similar, repite la palabra clave ADD pero (si leo el diagrama correctamente) no requiere una coma para separar los elementos agregados.

Sintaxis de Microsoft SQL Server :

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

Algunos otros no le permiten combinar operaciones ALTER TABLE como esa. SQL estándar solo permite una sola operación en la instrucción ALTER TABLE, por lo que en SQL estándar, debe hacerse en dos pasos.

Jonathan Leffler
fuente
55
Segunda adición y restricción.
Imran
18
Para la parte SQL, para dar nombre a la restricción, lo escribe así: ALTER TABLE [Messages] ADD [AlertTriggerID] BIGINT NULL, CONSTRAINT FK_Messages_AlertTriggers FOREIGN KEY (AlertTriggerID) REFERENCES AlertTriggers (AlertTriggerID);
Dragos Durlut
78

En MS-SQLServer:

ALTER TABLE one
ADD two_id integer CONSTRAINT fk FOREIGN KEY (two_id) REFERENCES two(id)
sqladmin
fuente
para qué motor DB es este?
Knocte
@knocte es para ms sql server - la pregunta ahora está etiquetada para aclarar eso
sqladmin
No creo que las necesidades pregunta aclaratoria, como la respuesta aceptada ya se afirma que hay una gran diferencia entre los motores de base de datos en la forma de hacerlo, lo que hay que aclarar es su respuesta, por lo que acabo de hacer que
knocte
9
Para nombrar su restricción. La respuesta aceptada permite que el sistema genere el nombre, que es repulsivo y difícil de administrar más adelante.
Derpy
17

Para SQL Server debería ser algo como

ALTER TABLE one
ADD two_id integer constraint fk foreign key references two(id)
jausel
fuente
1
Esto es un poco más conciso que las otras respuestas.
Sam
11

En MS SQL SERVER:

Con nombre de clave externa definida por el usuario

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

Sin nombre de clave externa definida por el usuario

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

En oráculo :

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

Actualización 2020

Es una pregunta bastante antigua, pero la gente todavía está volviendo a ella, veo. En caso de que las respuestas anteriores no lo hayan ayudado, asegúrese de estar utilizando el mismo tipo de datos para la nueva columna que el ID de la otra tabla.

En mi caso, estaba usando Laravel y uso "entero sin signo" para todos mis identificadores, ya que no tiene sentido tener un ID negativo LOL.

Entonces, para eso, la consulta SQL sin formato cambiará así:

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

Espero que ayude

Aprendiz
fuente
1
"AGREGAR RESTRICCIÓN" debería ser simplemente "RESTRICCIÓN", ¿sí?
TimH
1

Puedes hacerlo como a continuación en SQL Server

ALTER TABLE one
ADD two_id int foreign key
REFERENCES two(id)
usuario2010014
fuente
1

PostgreSQL DLL para agregar una columna FK:

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

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

Arsman Ahmad
fuente
1

Para DB2, la sintaxis es:

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

Si también necesita agregar valores predeterminados en caso de que ya tenga algunas filas en la tabla, agregue el valor POR DEFECTO

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

Prueba esto:

ALTER TABLE product
ADD FOREIGN KEY (product_ID) REFERENCES product(product_ID);
Michael Alavanyo
fuente
1
Bienvenido a SO! Por favor, comente sus respuestas cuando sean solo código. En su caso, hay muchas respuestas bastante similares a las suyas, así que exponga los beneficios de las suyas.
David García Bodego