Código de error: 1005. No se puede crear la tabla '…' (errno: 150)

103

Busqué una solución a este problema en Internet y verifiqué las preguntas de Stack Overflow, pero ninguna de las soluciones funcionó 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 devuelve:

Error Code: 1005. Can't create table 'ebs.#sql-f48_1a3' (errno: 150)

Intenté agregar un índice a la tabla referenciada:

CREATE INDEX METAL_KODU_INDEX ON metal_kod (METAL_KODU);

Revisé METAL_KODU en ambas tablas (juego de caracteres y colación), pero no pude encontrar una solución a este problema. ¿Como puedo solucionar este problema?

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
lamostreta
fuente
¿Puede mostrar el esquema de la metal_kodtabla ... qué campo de esa tabla debe hacer referencia a la clave externa?
Manse

Respuestas:

271

Código de error: 1005: hay una referencia de clave primaria incorrecta en su código

Por lo general, se debe a un campo de clave externa referenciado que no existe. Puede ser que tenga un error tipográfico, o marque si debería ser el mismo, o hay una falta de coincidencia en el tipo de campo. Los campos vinculados a claves externas deben coincidir exactamente con las definiciones.

Algunas causas conocidas pueden ser:

  1. El tipo y / o tamaño de los dos campos clave no coinciden exactamente. Por ejemplo, si uno es INT(10)el campo clave debe ser INT(10)así y no INT(11)o TINYINT. Es posible que desee confirmar el tamaño del campo utilizando SHOW CREATE TABLEporque el Explorador de consultas a veces se mostrará visualmente solo INTEGERpara ambos INT(10)y INT(11). También debe comprobar que uno no lo es SIGNEDy el otro sí UNSIGNED. Ambos deben ser exactamente iguales.
  2. Uno de los campos clave que está intentando hacer 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.
  3. 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 aleatorios al final de su nombre de clave para probar esto.
  4. Una o ambas de sus mesas es una MyISAMmesa. Para utilizar claves foráneas, las tablas deben ser InnoDB. (En realidad, si ambas tablas lo son MyISAM, no recibirá un mensaje de error, simplemente no creará la clave). En el Explorador de consultas, puede especificar el tipo de tabla.
  5. Ha especificado una cascada ON DELETE SET NULL, pero el campo clave relevante está establecido en NOT NULL. Puede solucionar esto cambiando su cascada o configurando el campo para permitir NULLvalores.
  6. Asegúrese de que las opciones Charset y Collate sean las mismas tanto a nivel de tabla como a nivel de campo individual para las columnas clave.
  7. Tiene un valor predeterminado (es decir, predeterminado = 0) en su columna de clave externa
  8. Uno de los campos de la relación es parte de una clave de combinación (compuesta) 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.
  9. Tiene un error de sintaxis en su ALTERdeclaración o ha escrito mal uno de los nombres de campo en la relación
  10. 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

Peter Mortensen
fuente
4
el problema era que los conjuntos de caracteres de la clave externa no coincidían. Gracias por la respuesta.
lamostreta
4
SHOW ENGINE INNODB STATUScomo se menciona en esta pregunta, me ayudó a diagnosticar mi problema particular (PEBCAK, en mi caso ...)
Hobo
1
maldita sea, incluso el es una clave primaria. Necesita crear un índice individual para esa clave. gracias esto resolvió mi problema.
RSB
3
El número 4 fue mi problema: una de las tablas era MyISAM y el script intentó crear una tabla InnoDB. Me encontré con este problema cuando intentaba implementar un sistema antiguo que inicialmente ejecutaba MySQL 5.0 o una versión similar, donde el motor de almacenamiento predeterminado era MyISAM y los scripts se estaban ejecutando correctamente. Mi entorno actual es 5.5 y el almacenamiento predeterminado es InnoDB. Agregar set names 'utf8', storage_engine=MYISAM;al comienzo del guión resolvió el problema para mí. ¡Gracias @ user319198 y @Stefano por la respuesta elaborada! : o)
Boris Chervenkov
1
Al mío le faltaba el atributo 'unsigned' como se menciona en el n. ° 1, ¡gracias!
helvete
11

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 de forma predeterminada.
Entonces, su primera tabla podría tener una clave externa de otra tabla que aún no se ha creado. En tales casos, desactive 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á.

happyhardik
fuente
4

Muy a menudo sucede cuando la clave externa y la clave de referencia no tienen el mismo tipo o la misma longitud.

zahid9i
fuente
4

A veces se debe a que la tabla maestra se descarta (tal vez al deshabilitar las verificaciones de claves externas), pero la clave externa CONSTRAINT todavía existe en otras tablas. En mi caso, había dejado caer la tabla e intenté recrearla, pero me estaba arrojando el mismo error.

Así que intente eliminar todas las RESTRICCIONES de clave externa de todas las tablas, si las hay, y luego actualice o cree la tabla.

rajug
fuente
2

Tuve un error similar. El problema tenía que ver con que la tabla secundaria y principal no tenían el mismo juego de caracteres y clasificación. Esto se puede solucionar agregando 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 falta algún código.

user2258168
fuente
2

La clave externa debe tener exactamente el mismo tipo que la clave principal a la que hace referencia. Para el ejemplo tiene el tipo "INT UNSIGNED NOT NULL" la clave extranjera 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';
Yaina Villafañes
fuente
unsigned fue el problema para mí. ¡Gracias!
Gabo
2

Código de error: 1005

Tuve un problema similar, así que aquí hay algunas cosas que probé (no en ningún orden, excepto por la solución :))

  1. Cambió los nombres de las claves externas (no funcionó)
  2. Redujo la longitud de la clave externa
  3. Verificó los tipos de datos (maldita sea, nada malo)
  4. Consultar índices
  5. Verifique las colaciones (todo bien, maldita sea de nuevo)
  6. Truncó la mesa, de nada sirve
  7. Dejó caer la mesa y la recreó
  8. Intenté ver si se estaba creando alguna referencia circular --- todo bien
  9. Finalmente, vi que tenía dos editores abiertos. Uno en PhpStorm (JetBrains) y el otro en el banco de trabajo MySQL. Parece que PhpStorm / MySQL Workbench 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.

Rajiv Nair
fuente
2

Tuve el mismo mensaje de error. Finalmente descubrí que había escrito 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é demonios MySQL no puede decir que tal tabla no existe ...

Csongor Halmai
fuente
1

MyISAM se acaba de mencionar. Simplemente intente agregar ENGINE = MyISAM DEFAULT CHARSET = latin1 AUTO_INCREMENT = 2; al final de una declaración, asumiendo que sus otras tablas fueron creadas 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 ;
Damir Olejar
fuente
1

En mi caso, sucedió cuando una tabla es InnoB y otra es MyISAM. Cambiar el motor de una tabla, a través de MySQL Workbench, me resuelve.

rkawano
fuente
1

Sucedió en mi caso, porque el nombre de la tabla a la que se hace referencia en la declaración de restricción no era correcto (olvidé las mayúsculas 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;
Abdellah Alaoui
fuente
1

compruebe que ambas tablas tienen el mismo esquema InnoDB MyISAM. Los hice todos iguales en mi caso InnoDB y trabajé

Brian Sánchez
fuente
1

Mi problema no estaba en la lista, era algo tan tonto ..... La tabla que tiene FKcomo PK era un compuesto PKque se declaró así: clave primaria ( CNPJ, CEP) Quería que el campo CEP estuviera FKen otra tabla y estaba atascado en este error, la moraleja de la historia simplemente invirtió el código anterior para la clave principal ( CEP, CNPJ) y funcionó. Recibe propinas a sus amigos.

fagner willys
fuente