Acabo de modificar una base de datos, no debió demorar las dos horas que demoré en realizar la tarea si no fuera por que MySQL no ha mejorado aun sus mensajes de error.
La tarea fue agregar una nueva clave foránea a una tabla existente, veamos como reproducir lo que me ha pasado:
-- Crear las tablas foo y bar
create table foo (
id integer not null primary key,
bar_id int not null
);
create table bar (
id integer not null primary key
);
-- Intentar crear una clave foránea
alter table foo
add foreign key(bar_id) references bar(ANY_FIELD) ;
Al ejecutar la ultima sentencia MySQL devuelve un error genérico que puede significar muchas cosas:
Error Code: 1005. Can't create table 'temp.#sql-4bd7_11' (errno: 150)
Todo hubiera sido mas fácil si me hubiera dado cuenta que escribí mal el campo de la tabla de deferencia bar(ANY_FIELD)
(algunas veces pasa), si el mensaje de horror hubiera dicho: "field bar.ANY_FIELD don't exists"
no estaría despierto hasta las 2am buscando una solución,
Estoy usando MySQL 5.5.21 community edition.
Los errores relacionados con FK quedan mejor explicados en SHOW ENGINE INNODB STATUS; ahí puedes leer la razón por la cual el FK falló, porque como bien dices, los Can’t create table ‘temp.#sql-4bd7_11’ no ayudan 🙂
No sería mala idea agregar un comentario como «use: SHOW ENGINE INNODB STATUS for more tails»