Pregunta

Tengo que crear una base de datos con dos tablas en MySQL, pero el guión falla con errno 150 (problema clave externa). Verifiqué los campos de clave externa a ser el mismo en ambas tablas, y no puedo encontrar ningún error.

Aquí está la secuencia de comandos:

 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 he intentado en Windows y Ubuntu con diferentes versiones de MySQL y no funcionó.

¿Alguna idea?

¿Fue útil?

Solución

table1.field1 no tiene ningún índice definido en ella.

Es necesario colocar una restricción FOREIGN KEY en field1.

Con esta:

 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 debe entonces funcionar como se espera.

Otros consejos

Mientras se trabaja con MySQL Workbench y MySQL 5.5.27, me he encontrado con el problema similar. En mi caso era cuestión con campos de tipo INT. Erróneamente en una mesa que estaba entero sin signo, y en referencia a la tabla que era INT.

En función de la versión de MySQL puede que tenga que crear un índice en table1.field1 primero.

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

  • Tipo de datos desajuste entre la clave primaria referenciada y hacer referencia a la clave externa
  • Índices. Todas las claves de extranjeros que el índice no debe ser NULL

Otra pista:

Aún cuando los tipos de datos parecen ser la misma - en mi caso ambas columnas tenido VARCHAR(50) -. Esto no es suficiente

También es necesario asegurarse de que las dos columnas tienen el mismo COLLATION.

Sin embargo, otra causa, aunque ligeramente similar a otros:. Me refiero a una tabla que resultó tener el motor MyISAM, en lugar de InnoDB

MySQL también lanzará este error si su escribir mal el nombre de la tabla de referencia. Saqué mi pelo hacia fuera por un tiempo hasta que me di cuenta de que echaba de menos una letra en foreign key (column1) references mistyped_table(column1)

Una opción (según el caso) sería la de desactivar la comprobación de integridad MySQL:

SET FOREIGN_KEY_CHECKS = 0;

Si nada funciona, intente lo siguiente:

El nombre de clave externa es un duplicado de una llave ya existente. Compruebe que el nombre de la clave externa es único dentro de su base de datos. Sólo tiene que añadir algunos caracteres aleatorios al final de su nombre clave de prueba para esto.

En mi caso, una mesa estaba usando claves foráneas en otra tabla que no existía todavía. Esto ocurría debido a una gran makefile, por lo que no era tan evidente como yo hubiera esperado.

En caso de que alguien todavía está teniendo problemas con esto, he intentado todas las soluciones anteriores (excepto para SET FOREIGN_KEY_CHECKS) y nada funcionó. El problema fue que cuando se hace referencia a la primera tabla, algunas bases de datos entre mayúsculas y minúsculas de los nombres de las tablas. Creo que esto es raro ya que nunca vi esto antes en MySQL, Oracle y ahora esto sucedió para mí en MariaDB.

Por ejemplo:

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

Crear tabla si no existe INFO ( Id_Maquina VARCHAR (16) NOT NULL, RESTRICCIÓN FK_infos_cadastro_maquinas clave externa (Id_Maquina) hace referencia a CADASTRO_MAQUINAS (Id) );

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

Yo estaba usando MySQL workBench. La cuestión es que no se puede utilizar el mismo foreign key name, necesitan ser unique. Así que si más de una tabla hará referencia a la misma clave externa, cada vez que debe ser un nombre unique dado.

Yo tenía un error similar en uno de mis cuadros. Cuando está marcada intercalación de columna era diferente, que una vez trabajó cambió ambas columnas al mismo tipo de intercalación.

Después de leer la mayor parte de la solución sugerida aquí. Sólo pensé que podría ser útil si sólo lista de todas las posibilidades que podría lanzar este error.

1, Compruebe CASO de la Columna 2, Compruebe colación de columnas 3, Compruebe si hay una clave creada en ambas tablas para la columna (Unique, Primaria)

En mi caso llegué vieja definición de la tabla MyISAM en una de las mesas y, obviamente, yo era incapaz de hacer clave externa a ella de otra tabla. Tal vez esto ayuda a alguien.

Así que esto puede ocurrir debido a las inconsistencias entre las dos bases de datos / campos definiciones tratan de comprobar:

Field Type
Field Collation
Table Engine

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

También puede encontrar el mismo error cuando se intenta 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 campo de tipo en la definición FK en el mismo orden en que aparecen en la definición de tabla PRIMARY KEY artículo.

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

En casos muy extraños su base de datos puede ser roto. En mi caso yo no tenía ningún claves externas en la mesa y el único cambio de nombre de la tabla o el cambio de motor ayudaron.

Resultó InnoDB se rompió, véase: https://dba.stackexchange.com/questions/86853/1025-error-on-rename-of-table-errno-150-table-was-deleted -mientras-tratado-a-un? LQ = 1

Si está trabajando en el banco de trabajo de MySQL y se obtiene este error para una tabla de relación no puede ser una solución rápida para usted: simplemente eliminarlo y dejar que el banco de trabajo MySQL recrear por usted. A continuación, copie el código SQL. Fijo mi errno 150 problema.

Tengo este error al intentar utilizar una clave externa para hacer referencia a un campo no único. (Que aparentemente no se permite)

Cuando tuve este problema se debía a que había establecido el ID de la primera tabla que se unsigned mientras que la clave externa de la segunda tabla no lo era. Lo que los hace unsigned fijado por mí.

Haga siempre las tablas del maestro / padre primero, y luego crear sus tablas detalle / niño.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top