tabla puedo incorrectly hy000 formed foreign error create crear constraint mysql mysql-error-1005

puedo - error 1005(hy000) can''t create table(errno 150) mysql



Mysql. No se puede crear la tabla errno 150 (22)

Cuando tuve este problema fue porque había configurado el id en la primera tabla para que unsigned se unsigned mientras que la clave externa en la segunda tabla no estaba. Haciéndolos ambos unsigned arregló para mí.

Tengo que crear un db con 2 tablas en mysql pero el script falla con errno 150 (Problema de clave externa). Comprobé dos veces que los campos de clave foránea sean los mismos en ambas tablas y no puedo encontrar ningún error.

Aquí está el guión:

SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0; SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE=''TRADITIONAL''; DROP SCHEMA IF EXISTS `testdb`; CREATE SCHEMA IF NOT EXISTS `testdb` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ; USE `testdb`; DROP TABLE IF EXISTS `testdb`.`table1` ; CREATE TABLE IF NOT EXISTS `testdb`.`table1` ( `id` INT UNSIGNED NOT NULL , `field1` VARCHAR(50) NULL , PRIMARY KEY (`id`) ) ENGINE = InnoDB; DROP TABLE IF EXISTS `testdb`.`table2` ; CREATE TABLE IF NOT EXISTS `testdb`.`table2` ( `id` INT NOT NULL AUTO_INCREMENT , `field1` VARCHAR(50) NULL , `date` DATE NULL , `cnt` INT NULL , PRIMARY KEY (`id`) , INDEX `FK_table2_table1` (`field1` ASC) , CONSTRAINT `FK_table2_table1` FOREIGN KEY (`field1`) REFERENCES `testdb`.`table1` (`field1` ) ON DELETE NO ACTION ON UPDATE NO ACTION) ENGINE = InnoDB; SET SQL_MODE=@OLD_SQL_MODE; SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS; SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

Lo intenté en Windows y Ubuntu con diferentes versiones de Mysql y no funcionó.

¿Algunas ideas? Muchas gracias.


En caso de que alguien todavía tenga problemas con esto, probé todas las soluciones anteriores (excepto SET FOREIGN_KEY_CHECKS) y no funcionó nada. El problema fue que cuando hace referencia a la primera tabla, algunas bases de datos distinguen entre mayúsculas y minúsculas sobre los nombres de las tablas. Creo que esto es extraño ya que nunca antes había visto esto en MySQL, Oracle y ahora esto me sucedió en MariaDB.

Por ejemplo:

Crear tabla si no existe CADASTRO_MAQUINAS (Id VARCHAR (16), Clave principal (Id));

Crear tabla si no existe INFOS (Id_Maquina VARCHAR (16) NOT NULL, CONSTRAINT FK_infos_cadastro_maquinas Clave externa (Id_Maquina) referencias CADASTRO_MAQUINAS (Id));

Si intento crear la segunda tabla usando cadastro_maquinas (minúsculas) en lugar de CADASTRO_MAQUINAS, recibiré este error.



En mi caso, obtuve la definición de tabla anterior MyISAM en una de las tablas y, obviamente, no pude convertirla en otra clave. Quizás esto ayude a alguien.

Entonces, esto puede suceder debido a las incoherencias entre dos bases de datos / definiciones de campos que intenta verificar:

Field Type Field Collation Table Engine


En mi caso, probablemente fue un error del servidor que arrojó una tabla con el mismo nombre. Dejar caer todo el shcema y volver a crearlo resolvió el problema.


En mi caso, una tabla usaba restricciones de clave externa en otra tabla que aún no existía. Esto estaba sucediendo debido a un gran archivo MAKE, por lo que no fue tan obvio como hubiera esperado.


Estaba usando MySQL workBench . El problema es que no puede usar el mismo foreign key name , deben ser unique . Entonces, si más de una tabla hará referencia a la misma clave externa, cada vez debe haber un nombre unique dado.


Mientras trabajaba con MySQL Workbench y MySQL 5.5.27, me encontré con el problema similar. En mi caso, el problema era con los campos de tipo INT. Erróneamente, en una tabla, se identificó INT SIN FIRMAR y en la tabla de referencia fue INT.


MySQL también lanzará este error si escribe mal el nombre de la tabla de referencia. Me saqué el pelo por un tiempo hasta que me di cuenta de que había perdido una letra en foreign key (column1) references mistyped_table(column1)


Obtuve este error al intentar usar una clave externa para hacer referencia a un campo no exclusivo. (que apparently no está permitido)


Otra causa, aunque ligeramente similar a otras: me refería a una tabla que resultó tener el motor MyISAM, en lugar de InnoDB.


Para mí, el problema fue con el uso de CONSTRAINT en la consulta CREATE TABLE .


Según la versión de MySQL, es posible que primero deba crear un índice en table1.field1.


Si está trabajando en mysql workbench y obtiene este error para una tabla de relaciones, puede haber una solución rápida para usted: simplemente elimínela y deje que mysql workbench la vuelva a crear para usted. Luego copie el sql. Se corrigió mi error errno 150.


Si nada funciona, intente esto:

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.


Siempre cree primero las tablas maestra / principal y luego cree las tablas detalladas / secundarias.


También puede encontrar el mismo error al intentar hacer referencia a una clave compuesta en su clave externa.

Por ejemplo:

CREATE TABLE `article` ( `id` int(10) unsigned NOT NULL, `type` enum(''X'',''Y'',''Z'') NOT NULL, PRIMARY KEY (`id`,`type`) ) ENGINE InnoDB; CREATE TABLE `t1` ( `user_id` int(10) unsigned NOT NULL, `type` enum(''X'',''Y'',''Z'') NOT NULL, `article_id` int(10) unsigned NOT NULL, CONSTRAINT `user_access_article_ibfk_2` FOREIGN KEY (`article_id`, `type`) REFERENCES `article` (`id`, `type`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB

En este caso, es importante utilizar article_id y type field en la definición de FK en el mismo orden en que aparecen en la tabla de artículo definición de PRIMARY KEY.


Tuve un error similar en una de mis tablas. Cuando la columna marcada Collation era diferente, lo que funcionó una vez cambió ambas columnas al mismo tipo de clasificación.

Después de leer la mayor parte de la solución sugerida aquí. Solo pensé que sería útil si enumerara todas las posibilidades que podrían arrojar este error.

1, Verificar CASO de la Columna 2, Verificar COLLACIÓN de Columnas 3, Verificar si hay una clave creada en ambas tablas para la columna (Único, Primario)


Una de las respuestas aquí sugiere desactivar la verificación de integridad de la clave externa. Esta es una mala idea. Hay dos posibles culpables aquí:

  • No coincide el tipo de datos entre la clave principal referenciada y la clave externa referenciada
  • Índices. Cualquier clave externa que indices no debe ser NULL

Una opción (según el caso) sería deshabilitar la verificación de integridad de mysql:

SET FOREIGN_KEY_CHECKS = 0;


table1.field1 no tiene un índice definido en él.

Se requiere colocar una restricción FOREIGN KEY en el field1 .

Con este:

CREATE TABLE IF NOT EXISTS `testdb`.`table1` ( `id` INT UNSIGNED NOT NULL , `field1` VARCHAR(50) NULL , KEY ix_table1_field1 (field1), PRIMARY KEY (`id`) ) ENGINE = InnoDB;

Todo debería funcionar como se espera.


Otra sugerencia:

Incluso cuando los tipos de datos parecen ser los mismos, en mi caso ambas columnas tenían VARCHAR(50) , esto no es suficiente.

También debe asegurarse de que ambas columnas tengan la misma COLLATION .