MySql Error 150 – Claves foráneas

Cuando ejecuto las siguientes dos consultas (las he desglosado a absolutamente necesario):

mysql> CREATE TABLE foo(id INT PRIMARY KEY); Query OK, 0 rows affected (0.01 sec) mysql> CREATE TABLE bar ( id INT, ref INT, FOREIGN KEY (ref) REFERENCES foo(id)) ENGINE InnoDB; 

Aparece el siguiente error: ERROR 1005 (HY000): No se puede crear la tabla ‘./test/bar.frm’ (errno: 150)

Donde el **** es mi error? No lo he encontrado mientras lo veo durante media hora.

    De restricciones FOREIGN KEY

    Si vuelve a crear una tabla que se descartó, debe tener una definición que se ajuste a las restricciones de clave externa que la hacen referencia. Debe tener los nombres y tipos de columnas correctos, y debe tener índices en las claves referenciadas, como se indicó anteriormente. Si no se cumplen, MySQL devuelve el error número 1005 y se refiere al error 150 en el mensaje de error.

    Mi sospecha es que no foo como InnoDB, ya que todo lo demás se ve bien.

    Editar: de la misma página –

    Ambas tablas deben ser tablas InnoDB y no deben ser tablas TEMPORALES.

    Puede usar el comando SHOW ENGINE INNODB STATUS

    Para crear una clave externa,

    1. tanto la columna principal como la columna de referencia deben tener la misma definición.
    2. el motor de ambas tablas debe ser InnoDB.

    Puede modificar el motor de la tabla con este comando, realice la copia de seguridad antes de ejecutar este comando.

    alter table [nombre de tabla] ENGINE = InnoDB;

    Tuve el mismo problema, para aquellos que también tienen esto:

    verifique el nombre de la tabla a la que se hace referencia

    Me olvidé de la ‘s’ al final del nombre de mi tabla

    por ejemplo, tabla Cliente -> Clientes

    🙂

    Aparte de muchas otras razones para terminar con MySql Error 150 (mientras usa InnoDB), una de las razones probables es la KEY indefinida en la statement de creación de la tabla que contiene el nombre de columna referenciado como una clave externa en la tabla relativa.

    Digamos que la statement de creación de la tabla maestra 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 syntax create para la tabla relative_table donde la restricción de clave foránea se establece desde 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 se usa InnoDB.

    Para resolver esto, necesitamos agregar una KEY para la columna record_id en la tabla master_table y luego hacer referencia en la tabla relative_table para ser usada como foreign_key.

    Finalmente, la sentencia create para 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;

    Tenía el mismo problema y la razón era que la “recostackción” de columnas era diferente. Uno era latin1 mientras que el otro era utf8

    Esto también puede suceder si no ha dado el nombre de columna correcto después de la palabra clave “referencias”.