Aparte forman muchas otras razones para terminar con MySQL Error 150 (durante el uso de InnoDB), uno de la razón probable, es el indefinido KEY
en la sentencia create de la tabla que contiene el nombre de la columna a la que se hace referencia como clave foránea en la tabla relativa.
Digamos que la declaración de tabla maestra crear es -
CREATE TABLE 'master_table' (
'id' int(10) NOT NULL AUTO_INCREMENT,
'record_id' char(10) NOT NULL,
'name' varchar(50) NOT NULL DEFAULT '',
'address' varchar(200) NOT NULL DEFAULT '',
PRIMARY KEY ('id')
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
y la creación de sintaxis para la tabla relative_table donde la restricción de clave externa se establece a partir de la tabla primaria -
CREATE TABLE 'relative_table' (
'id' int(10) NOT NULL AUTO_INCREMENT,
'salary' int(10) NOT NULL DEFAULT '',
'grade' char(2) NOT NULL DEFAULT '',
'record_id' char(10) DEFAULT NULL,
PRIMARY KEY ('id'),
CONSTRAINT 'fk_slave_master' FOREIGN KEY ('record_id') REFERENCES 'master' ('record_id')
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Este script definitivamente terminará con MySql Error 150 si usa InnoDB.
Para solucionar esto, tenemos que añadir una KEY
para la La columna record_id
en la tabla master_table
y luego hacer referencia en la tabla relative_table
para ser utilizado como un foreign_key.
Por último, la sentencia de creación de la master_table
, será -
CREATE TABLE 'master_table' (
'id' int(10) NOT NULL AUTO_INCREMENT,
'record_id' char(10) NOT NULL,
'name' varchar(50) NOT NULL DEFAULT '',
'address' varchar(200) NOT NULL DEFAULT '',
PRIMARY KEY ('id'),
KEY 'record_id' ('record_id')
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Un poco de prueba rápida, creando un 'foo' como el anterior con MyISAM, y una' barra' con InnoDB, sugiere que ese sea el caso - intente verificar dos veces su tipo de tabla para 'foo'. – Rob
+1 para "Ambas tablas deben ser tablas InnoDB", ¡muchas gracias! – sanbhat
Incluso cuando ambas tablas eran InnoDB, todavía tenía el mismo problema. Lo arreglé por el índice creado en la tabla referida antes de crear la clave externa. – IROEGBU