Contexto:
Intentar crear una clave foránea entre dos tablas en MySQL 5, usando una sentencia como la siguiente:
ALTER TABLE tabla1 ADD CONSTRAINT `FK_tabla1_tabla2_id` FOREIGN KEY (tabla2_id) REFERENCES tabla2(id) ON DELETE RESTRICT ON UPDATE CASCADE;
Al ejecutar la sentencia aparece un error como el siguiente (en phpMyAdmin):
#1005 - Can't create table 'db_test.#sql-51c_d7f' (errno: 150)
Lo cual para MySQL es la siguiente advertencia:
Supports transactions, row-level locking, and foreign keys
Puntos a revisar:
- Que el nombre de la clave no esté repetido: correcto
- Que el nombre del campo y la tabla destino y origen estén bien: correcto
- Que ambas tablas sean InnoDB: correcto
- Que ambos campos sean del mismo tamaño: correcto
- ... muchas más pruebas desesperadas: correcto
... y la solución real:
Puede parecer sencillo pero verla, por lo simple, fue una odisea. El campo origen (tabla1.tabla2_id) NO ERA UNSIGNED mientras que el campo destino SI lo era :'(
Un error sutil pero que hace que ambos campos no sean idénticos y por ende no puedan compartir una clave foránea. Solución: modificar el campo origen para hacerlo no signado (UNSIGNED) y que de esa manera ambos campos sean completamente idénticos.
increible, ya tenia dos días buscando una solución, muchas gracias por tu nota mental.
ResponderEliminarY como un valor INT lo hago UNSIGNED?
ResponderEliminarColocando la palabra UNSIGNED luego del tipo de dato, por ejemplo:
ResponderEliminarALTER TABLE `tabla1` CHANGE `tabla2_id` `tabla2_id` INT(5) UNSIGNED NOT NULL;