¿Cómo agregar una columna y convertirla en una clave externa en una sola declaración de MySQL?

81

En mysql, ¿puedo agregar una columna y una clave externa en la misma declaración? ¿Y cuál es la sintaxis adecuada para agregar el fk?

Aquí está mi SQL:

ALTER TABLE database.table
 ADD COLUMN columnname INT DEFAULT(1),
 FOREIGN KEY (fk_name) REFERENCES reftable(refcolumn) ON DELETE CASCADE;

... y el mensaje de error que lo acompaña:

Tiene un error en su sintaxis SQL; consulte el manual que corresponde a la versión de su servidor MySQL para conocer la sintaxis correcta para usar cerca de 'FOREIGN KEY (fk_name) REFERENCES reftable (refcolumn) ON DELETE CASCADE' en la línea 4

VinnieP
fuente

Respuestas:

96

Prueba esto:

ALTER TABLE database.table
  ADD COLUMN columnname INT DEFAULT(1),
  ADD FOREIGN KEY fk_name(fk_column) REFERENCES reftable(refcolumn) ON DELETE CASCADE;
Asaph
fuente
6
¿Y para fk_namey fk_columntengo que insertar qué ...?
C4d
7
@ C4ud3x fk_nameserá un nombre que le gustaría darle a esta restricción particular con el propósito de identificación (eso es opcional en la consulta) mysql también lo genera automáticamente, y fk_columnes la columna de referencia que desea que funcione como clave externa.
Rabia Naz khan
1
Aconsejaría a todos que especifiquen explícitamente el nombre de la restricción. Los problemas desagradables pueden encontrarlo si desea eliminar esa columna en el futuro, y su sistema ya se ejecuta en diferentes bases de datos que tienen diferentes ideas sobre cómo nombrar automáticamente las restricciones (mariaDB vs mySQL, por ejemplo). Quería ahorrar esta línea de código y no especifiqué la restricción, como aquí. Algunos meses después de que pagué el precio, intenté escribir una migración que eliminaría la columna en todos los sistemas. stackoverflow.com/questions/55374835/…
Alkis Mavridis
37

La siguiente consulta agrega una columna por consulta alter y la consulta de restricción la convierte en un FK en una sola consulta mysql. Puedes hacerlo así

SINTAXIS:

ALTER TABLE `SCHEMANAME`.`TABLE1` 
ADD COLUMN `FK_COLUMN` BIGINT(20) NOT NULL, 
ADD CONSTRAINT `FK_TABLE2_COLUMN` FOREIGN KEY (`FK_COLUMN`) 
REFERENCES `SCHEMANAME`.`TABLE2`(`PK_COLUMN`);

EJEMPLO:

ALTER TABLE `USERDB`.`ADDRESS_TABLE` 
ADD COLUMN `USER_ID` BIGINT(20) NOT NULL AFTER `PHONE_NUMBER`, 
ADD CONSTRAINT `FK_CUSTOMER_TABLE_CUSTOMER_ID` FOREIGN KEY (`USER_ID`) 
REFERENCES `USERDB`.`CUSTOMER_TABLE`(`CUSTOMER_ID`); 
Suerte
fuente
2

Esto se puede simplificar un poco. Solo necesita agregar la palabra clave "ADD" antes de "FOREIGN KEY". Añadiendo un ejemplo a continuación.

ALTER TABLE database.table
ADD COLUMN columnname INT DEFAULT(1),
ADD FOREIGN KEY (fk_name) REFERENCES reftable(refcolumn) ON DELETE CASCADE;
Satendra Rawat
fuente
-3

Puedes usarlo.

ALTER TABLE database.table
ADD COLUMN columnname INT DEFAULT(1);
ALTER TABLE database.table add FOREIGN KEY (fk_name) REFERENCES reftable(refcolumn) ON DELETE CASCADE;
Aabid Ansar
fuente