name - update foreign key mysql
MySql Error 150-Claves foráneas (7)
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.
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.
Tuve el mismo problema, para aquellos que están teniendo esto también:
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
:)
Tenía el mismo problema y la razón era que la "recopilación" de columnas era diferente. Uno era latin1 mientras que el otro era utf8
Puede usar el comando SHOW ENGINE INNODB STATUS
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 declaración de creación de la tabla que contiene el nombre de columna referenciado como una clave externa en la tabla relativa.
Digamos que la declaración 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 sintaxis 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;
Esto también puede suceder si no ha dado el nombre de columna correcto después de la palabra clave "referencias".
Para crear una clave externa,
- tanto la columna principal como la columna de referencia deben tener la misma definición.
- 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;