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

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:

  1. 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 ser INT(10) y no INT(11) o TINYINT . Es posible que desee confirmar el tamaño del campo usando SHOW CREATE TABLE porque el buscador de consultas a veces mostrará visualmente INTEGER tanto para INT(10) como para INT(11) . También debe verificar que uno no esté SIGNED y que el otro NO SIGNED . Ambos necesitan ser exactamente iguales.
  2. 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.
  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 al azar al final de su nombre de clave para probar esto.
  4. Una o ambas tablas es una tabla MyISAM . Para usar claves externas, las tablas deben ser ambas InnoDB . (En realidad, si ambas tablas son MyISAM entonces no recibirá un mensaje de error, simplemente no creará la clave). En el buscador 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 estableciendo el campo para permitir valores NULL .
  6. 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.
  7. Tiene un valor predeterminado (es decir, por defecto = 0) en su columna de clave externa
  8. 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.
  9. Tiene un error de syntax en su instrucción ALTER 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

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á.

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

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.

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 :))

  1. Cambió los nombres de las claves externas (no funcionó)
  2. Reduce la longitud de la clave externa
  3. Verificado los tipos de datos (no hay nada mal)
  4. Ver índices
  5. Compruebe las intercalaciones (todo está bien, maldita sea de nuevo)
  6. Truncado la mesa, de poco uso
  7. Dejó la mesa y volvió a crear
  8. 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 locking de edición. Cerré PHPStorm solo para verificar si el locking era el caso (podría haber sido al revés). Esto resolvió mi problema. Espero que esto ayude a alguien a tener problemas similares.

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 statement SQL significa que hay algún código faltante.

Sucedió en mi caso porque el nombre de la tabla a la que se hace referencia en la statement 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.

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'; 

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 ; 

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í.

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 …