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.


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.


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)

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)

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

3

En oráculo :

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

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


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)


1

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


1

Para DB2, la sintaxis es:

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

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

0

Prueba esto:

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

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.