La restricción de clave externa de mysql es un error formado incorrectamente
table1
es la tabla principal con una columna ID
y table2
tiene una columna IDFromTable1
.
¿ Por qué cuando pongo un FK IDFromTable1
me ID
sale ?table1
Foreign key constraint is incorrectly formed error
(Me gustaría eliminar el table2
registro si table1
se elimina).
ALTER TABLE `table2`
ADD CONSTRAINT `FK1`
FOREIGN KEY (`IDFromTable1`) REFERENCES `table1` (`ID`)
ON UPDATE CASCADE
ON DELETE CASCADE;
Los motores de ambas tablas son InnoDB. Ambas columnas son de tipo char
. ID
es la clave principal en table1
.
Me encontré con el mismo problema con HeidiSQL. El error que recibe es muy críptico. Mi problema terminó siendo que la columna de clave externa y la columna de referencia no eran del mismo tipo o longitud.
La columna de clave externa era SMALLINT(5) UNSIGNED
y la columna a la que se hace referencia era INT(10) UNSIGNED
. Una vez que los hice exactamente del mismo tipo, la creación de clave externa funcionó perfectamente.
Para cualquiera que enfrente este problema, simplemente ejecute
SHOW ENGINE INNODB STATUS
y consulte la sección ÚLTIMO ERROR DE CLAVE EXTRANJERA para obtener más detalles.
Tuve el mismo problema cuando se creó la tabla principal usando MyISAM
el motor. Es un error tonto, que solucioné con:
ALTER TABLE parent_table ENGINE=InnoDB;
asegúrese de que las columnas sean idénticas (del mismo tipo) y si la columna de referencia no lo es primary_key
, asegúrese de que lo sea INDEXED
.
La sintaxis para definir claves externas es muy indulgente, pero para cualquiera que se equivoque con esto, el hecho de que las claves externas deben ser "del mismo tipo" se aplica incluso a la intercalación, no solo al tipo de datos, la longitud y la firma de bits.
No es que mezclarías la intercalación en tu modelo (¿lo harías?), pero si lo haces, asegúrate de que tus campos de clave primaria y externa sean del mismo tipo de intercalación en phpmyadmin o Heidi SQL o lo que sea que uses.
Espero que esto te ahorre las cuatro horas de prueba y error que me costó a mí.