La restricción de clave externa de mysql es un error formado incorrectamente

Resuelto user516883 asked hace 13 años • 37 respuestas

table1es la tabla principal con una columna IDy table2tiene una columna IDFromTable1.

¿ Por qué cuando pongo un FK IDFromTable1me IDsale ?table1Foreign key constraint is incorrectly formed error

(Me gustaría eliminar el table2registro si table1se 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. IDes la clave principal en table1.

user516883 avatar Dec 08 '11 23:12 user516883
Aceptado

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) UNSIGNEDy 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.

Jake Wilson avatar Jun 19 '2012 01:06 Jake Wilson

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.

Sidonai avatar Oct 07 '2020 20:10 Sidonai

Tuve el mismo problema cuando se creó la tabla principal usando MyISAMel motor. Es un error tonto, que solucioné con:

ALTER TABLE parent_table ENGINE=InnoDB;
Denis Malinovsky avatar Dec 14 '2015 18:12 Denis Malinovsky

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.

Santosh avatar Jun 09 '2016 08:06 Santosh

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í.

user2297047 avatar Apr 18 '2013 21:04 user2297047