formed - mysql error 150
Código de error: 1005. No se puede crear la tabla ''...''(errno: 150) (11)
Busqué una solución a este problema en Internet y revisé las preguntas de SO, pero no funcionó ninguna solución para mi caso.
Quiero crear una clave externa de la tabla sira_no a metal_kod.
ALTER TABLE sira_no
ADD CONSTRAINT METAL_KODU FOREIGN KEY(METAL_KODU)
REFERENCES metal_kod(METAL_KODU)
ON DELETE SET NULL
ON UPDATE SET NULL ;
Este script vuelve:
Error Code: 1005. Can''t create table ''ebs.#sql-f48_1a3'' (errno: 150)
Traté de agregar índice a la tabla referenciada:
CREATE INDEX METAL_KODU_INDEX ON metal_kod (METAL_KODU);
Comprobé METAL_KODU en ambas tablas (conjunto de caracteres y colación). Pero no pudo encontrar una solución a este problema. ¿Alguien tiene alguna idea? Gracias por adelantado.
EDITAR: Aquí está la tabla metal_kod:
METAL_KODU varchar(4) NO PRI
DURUM bit(1) NO
METAL_ISMI varchar(30) NO
AYAR_YOGUNLUK smallint(6) YES 100
Código de error: 1005 - hay una referencia de clave primaria incorrecta en su código
generalmente se debe a que no existe un campo FK de referencia. podría ser que tenga un error tipográfico, o verifique si es el mismo, o si hay una discrepancia de campo. Los campos vinculados a FK deben coincidir exactamente con las definiciones.
Algunas causas conocidas pueden ser:
- Los dos campos clave tipo y / o tamaño no coinciden exactamente. Por ejemplo, si uno es
INT(10)
el campo clave también debe serINT(10)
y noINT(11)
oTINYINT
. Es posible que desee confirmar el tamaño del campo usandoSHOW
CREATE
TABLE
porque el buscador de consultas a veces mostrará visualmenteINTEGER
tanto paraINT(10)
como paraINT(11)
. También debe verificar que uno no estéSIGNED
y que el otro NOSIGNED
. Ambos necesitan ser exactamente iguales. - Uno de los campos de clave que está tratando de referencia no tiene un índice y / o no es una clave principal. Si uno de los campos de la relación no es una clave principal, debe crear un índice para ese campo.
- El nombre de la clave externa es un duplicado de una clave ya existente. Verifique que el nombre de su clave externa sea único dentro de su base de datos. Simplemente agregue algunos caracteres al azar al final de su nombre de clave para probar esto.
- Una o ambas tablas es una tabla
MyISAM
. Para usar claves externas, las tablas deben ser ambasInnoDB
. (En realidad, si ambas tablas sonMyISAM
entonces no recibirá un mensaje de error, simplemente no creará la clave). En el buscador de consultas, puede especificar el tipo de tabla. - Ha especificado una cascada
ON
DELETE
SET
NULL
, pero el campo clave relevante está establecido enNOT
NULL
. Puede solucionar esto cambiando su cascada o estableciendo el campo para permitir valoresNULL
. - Asegúrese de que las opciones Charset y Clasificar sean las mismas tanto a nivel de tabla como a nivel de campo individual para las columnas clave.
- Tiene un valor predeterminado (es decir, por defecto = 0) en su columna de clave externa
- Uno de los campos de la relación es parte de una combinación (compuesta) clave y no tiene su propio índice individual. Aunque el campo tiene un índice como parte de la clave compuesta, debe crear un índice separado solo para ese campo clave para poder usarlo en una restricción.
- Tiene un error de sintaxis en su instrucción
ALTER
o ha escrito mal uno de los nombres de campo en la relación - El nombre de su clave externa excede la longitud máxima de 64 caracteres.
para obtener más detalles, consulte: Número de error de MySQL 1005 No se puede crear la tabla
Código de error: 1005
Hola, expongo esta respuesta para que cualquier persona que se enfrente a un problema similar al mío pueda beneficiarse de esta respuesta. Confíe en mí esto puede pasarse por alto) (esto puede haber sido ya respondido y si es así, discúlpeme)
Tuve un problema similar, así que aquí hay algunas cosas que sí intenté (no en ningún orden, excepto por la solución :))
- Cambió los nombres de las claves externas (no funcionó)
- Reduce la longitud de la clave externa
- Verificado los tipos de datos (no hay nada mal)
- Ver índices
- Compruebe las intercalaciones (todo está bien, maldita sea de nuevo)
- Truncado la mesa, de poco uso
- Dejó la mesa y volvió a crear
- Intenté ver si se estaba creando alguna referencia circular --- todo bien
9. Finalmente, vi que tenía dos editores abiertos. Uno que en PHPStorm (jetbrains) y el otro banco de trabajo MySQL. Parece que el banco de trabajo PHPStorm / SQL crea algún tipo de bloqueo de edición. Cerré PHPStorm solo para verificar si el bloqueo era el caso (podría haber sido al revés). Esto resolvió mi problema. Espero que esto ayude a alguien a tener problemas similares.
En mi caso, sucedió cuando una tabla es InnoB y otra es MyISAM. Cambiando el motor de una tabla, a través de MySQL Workbench, resuelve para mí.
Esto también podría suceder al exportar su base de datos de un servidor a otro y las tablas se enumeran en orden alfabético por defecto.
Por lo tanto, su primera tabla podría tener una clave externa de otra tabla que aún no se ha creado. En tales casos, deshabilite foreign_key_checks y cree la base de datos.
Simplemente agregue lo siguiente a su secuencia de comandos:
SET FOREIGN_KEY_CHECKS=0;
y funcionará.
La clave externa debe tener exactamente el mismo tipo que la clave primaria a la que hace referencia. Para el ejemplo tiene el tipo "INT UNSIGNED NOT NULL" la clave externa también tiene que "INT UNSIGNED NOT NULL"
CREATE TABLE employees(
id_empl INT UNSIGNED NOT NULL AUTO_INCREMENT,
PRIMARY KEY(id)
);
CREATE TABLE offices(
id_office INT UNSIGNED NOT NULL AUTO_INCREMENT,
id_empl INT UNSIGNED NOT NULL,
PRIMARY KEY(id),
CONSTRAINT `constraint1` FOREIGN KEY (`id_empl`) REFERENCES `employees` (`id_empl`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT=''my offices'';
Muy a menudo sucede, cuando la clave externa y la clave de referencia no tienen el mismo tipo o la misma longitud
MyISAM ha sido mencionado. Simplemente intente agregar ENGINE = MyISAM DEFAULT CHARSET = latin1 AUTO_INCREMENT = 2; al final de un enunciado, suponiendo que sus otras tablas se crearon con MyISAM.
CREATE TABLE IF NOT EXISTS `tablename` (
`key` bigint(20) NOT NULL AUTO_INCREMENT,
FOREIGN KEY `key` (`key`) REFERENCES `othertable`(`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;
Sé que esta es una respuesta tardía, pero pensé que esto podría ser útil para alguien.
A veces se debe a que la tabla maestra se descarta (tal vez al deshabilitar la clave foránea), pero la RESTRICCIÓN de clave foránea aún existe en otras tablas. En mi caso, había abandonado la mesa e intentado recrearla, pero me estaba arrojando el mismo error.
Intente descartar todas las restricciones de clave externa de todas las tablas si las hay y luego actualice o cree la tabla.
Sucedió en mi caso porque el nombre de la tabla a la que se hace referencia en la declaración de restricción no es correcto (olvidé la mayúscula en el nombre de la tabla)
ALTER TABLE `Window` ADD CONSTRAINT `Windows_ibfk_1` FOREIGN KEY (`WallId`) REFERENCES `Wall` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
Espero que eso ayude.
Tenía el mismo mensaje de error. Finalmente me di cuenta de que escribí mal el nombre de la tabla en el comando:
ALTER TABLE `users` ADD FOREIGN KEY (country_id) REFERENCES country (id);
versus
ALTER TABLE `users` ADD FOREIGN KEY (country_id) REFERENCES countries (id);
Me pregunto por qué en la tierra, mysql no puede decir que tal mesa no existe ...
Tuve un error similar. El problema tenía que ver con que la tabla principal y secundaria no tenían el mismo conjunto de caracteres y la misma intercalación. Esto se puede solucionar añadiendo ENGINE = InnoDB DEFAULT CHARACTER SET = utf8;
CREATE TABLE IF NOT EXISTS `country` (`id` INT(11) NOT NULL AUTO_INCREMENT,...) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8;
... en la declaración SQL significa que hay algún código faltante.