Error de MySQL 1215: No se puede agregar restricción de clave foránea


Estoy tratando de reenviar el ingeniero de mi nuevo esquema en mi servidor de base de datos, pero no puedo averiguar por qué estoy recibiendo este error. He intentado buscar la respuesta aquí, pero todo lo que he encontrado ha dicho que configure el motor de base de datos en Innodb o para asegurarse de que las claves que estoy tratando de usar como clave externa sean claves primarias en sus propias tablas. He hecho ambas cosas, si no me equivoco. ¿Alguna otra ayuda que puedan ofrecer?

Executing SQL script in server

ERROR: Error 1215: Cannot add foreign key constraint

-- -----------------------------------------------------
-- Table `Alternative_Pathways`.`Clients_has_Staff`
-- -----------------------------------------------------

CREATE  TABLE IF NOT EXISTS `Alternative_Pathways`.`Clients_has_Staff` (
  `Clients_Case_Number` INT NOT NULL ,
  `Staff_Emp_ID` INT NOT NULL ,
  PRIMARY KEY (`Clients_Case_Number`, `Staff_Emp_ID`) ,
  INDEX `fk_Clients_has_Staff_Staff1_idx` (`Staff_Emp_ID` ASC) ,
  INDEX `fk_Clients_has_Staff_Clients_idx` (`Clients_Case_Number` ASC) ,
  CONSTRAINT `fk_Clients_has_Staff_Clients`
    FOREIGN KEY (`Clients_Case_Number` )
    REFERENCES `Alternative_Pathways`.`Clients` (`Case_Number` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_Clients_has_Staff_Staff1`
    FOREIGN KEY (`Staff_Emp_ID` )
    REFERENCES `Alternative_Pathways`.`Staff` (`Emp_ID` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB

Ejecución del script SQL terminada: instrucciones: 7 tuvo éxito, 1 falló

Aquí está el SQL para las tablas padre.

CREATE  TABLE IF NOT EXISTS `Alternative_Pathways`.`Clients` (
  `Case_Number` INT NOT NULL ,
  `First_Name` CHAR(10) NULL ,
  `Middle_Name` CHAR(10) NULL ,
  `Last_Name` CHAR(10) NULL ,
  `Address` CHAR(50) NULL ,
  `Phone_Number` INT(10) NULL ,
  PRIMARY KEY (`Case_Number`) )
ENGINE = InnoDB

CREATE  TABLE IF NOT EXISTS `Alternative_Pathways`.`Staff` (
  `Emp_ID` INT NOT NULL ,
  `First_Name` CHAR(10) NULL ,
  `Middle_Name` CHAR(10) NULL ,
  `Last_Name` CHAR(10) NULL ,
  PRIMARY KEY (`Emp_ID`) )
ENGINE = InnoDB
Author: Robert B, 2013-06-06

27 answers

Supongo que Clients.Case_Number y/o Staff.Emp_ID no son exactamente el mismo tipo de datos Clients_has_Staff.Clients_Case_Number y Clients_has_Staff.Staff_Emp_ID.

Tal vez las columnas en las tablas principales son INT UNSIGNED?

Deben ser exactamente del mismo tipo de datos en ambas tablas.

 452
Author: Ike Walker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-06 18:08:27

Razones por las que puede obtener un error de restricción de clave foránea:

  1. No está utilizando InnoDB como motor en todas las mesas.
  2. Está intentando hacer referencia a una clave inexistente en la tabla de destino. Asegúrese de que es una clave en la otra tabla (puede ser una clave primaria o única)
  3. Los tipos de las columnas no son los mismos (la excepción es que la columna en la tabla de referencia puede ser nullable).
  4. Si el PK / FK es un varchar asegúrese de que la intercalación es la misma para ambos.

Actualización:

  1. Una de las razones también puede ser que la columna que está utilizando para ON DELETE SET NULL no está definida como null. Así que asegúrese de que la columna se establece por defecto null.

Compruebe estos.

 181
Author: Explosion Pills,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-23 16:29:34

Para otros el mismo error puede no ser siempre debido a la falta de coincidencia del tipo de columna, puede encontrar más información sobre un error de clave de mysql foriegn emitiendo el comando

SHOW ENGINE INNODB STATUS;

Puede encontrar un error cerca de la parte superior del mensaje impreso algo como

No puede encontrar un índice en la tabla referenciada donde el las columnas referenciadas aparecen como las primeras columnas o tipos de columna en la tabla y la tabla referenciada no coinciden con la restricción.

 71
Author: arvind,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-26 00:39:44

El error 1215 es molesto. La respuesta de la píldora Explosiva cubre lo básico. Usted quiere asegurarse de empezar desde allí. Sin embargo, hay más casos, mucho más sutiles a tener en cuenta:

Por ejemplo, cuando intente vincular claves PRIMARIAS de diferentes tablas, asegúrese de proporcionar las opciones ON UPDATE y ON DELETE adecuadas. Por ejemplo:

...
PRIMARY KEY (`id`),
FOREIGN KEY (`id`) REFERENCES `t` (`other_id`) ON DELETE SET NULL
....

No volará, porque las claves PRIMARIAS (como id) no pueden ser NULL.

Estoy seguro de que hay aún más, de manera similar cuestiones sutiles cuando agregar este tipo de restricciones, por lo que al encontrar errores de restricción, siempre asegúrese de que las restricciones y sus implicaciones tengan sentido en su contexto actual. Buena suerte con su error 1215!

 12
Author: Domi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:54:58

En mi caso, había eliminado una tabla usando SET FOREIGN_KEY_CHECKS=0, luego SET FOREIGN_KEY_CHECKS=1 después. Cuando fui a recargar la mesa, obtuve error 1215. El problema era que había otra tabla en la base de datos que tenía una clave externa a la tabla que había eliminado y estaba recargando. Parte del proceso de recarga implicaba cambiar un tipo de datos para uno de los campos, lo que hacía inválida la clave foránea de la otra tabla, activando así error 1215. Resolví el problema dejando caer y luego recargando la otra tabla con los nuevos datos escriba para el campo involucrado.

 7
Author: CodeMed,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-06 09:45:09

Compruebe el cotejo de la tabla, usando SHOW TABLE STATUS puede consultar información sobre las tablas, incluida la intercalación.

Ambas tablas tienen que tener la misma intercalación.

Me ha pasado a mí.

 6
Author: Carlos Laspina,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-29 03:53:18

Hay un escollo que he experimentado con "Error 1215: Cannot add foreign key constraint" al usar Laravel 4, especialmente con los generadores Laravel 4 de JeffreyWay.

En Laravel 4, puede usar los generadores de JeffreyWay para generar archivos de migración para crear tablas uno por uno, lo que significa que cada archivo de migración genera una tabla. Debe tener en cuenta el hecho de que cada archivo de migración se genera con una marca de tiempo en el nombre del archivo, lo que le da a los archivos un orden. La orden de la generación es también el orden de operación de migración cuando se activa el comando Artisan CLI "php artisan migrate". Por lo tanto, si un archivo solicita una restricción de clave foránea que se refiera a una clave que se generará, pero aún no, en un último archivo, se dispara el error 1215. En tal caso, lo que tiene que hacer es ajustar el orden de generación de archivos de migración. Genere nuevos archivos en el orden adecuado, copie el contenido y luego elimine los archivos antiguos desordenados.

 5
Author: user2975399,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-12-06 09:08:26

Obtuve el mismo error al intentar agregar un fk. En mi caso, el problema fue causado por el PK de la tabla FK que estaba marcado como sin signo.

 4
Author: Alex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-12 23:47:21

Yo tenía el mismo problema.
Lo resolví haciendo esto:

He creado la siguiente línea en el
primary key: (id int(11) unsigned NOT NULL AUTO_INCREMENT)

Descubrí esta solución después de intentar importar una tabla en mi schema builder. Si funciona para ti, házmelo saber!

¡Buena suerte!

Felipe Tércio

 3
Author: user3478348,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-16 18:44:34

No puedo encontrar este error

CREATE TABLE RATING (

Riv_Id INT(5),
Mov_Id INT(10) DEFAULT 0,
Stars INT(5),
Rating_date DATE, 

PRIMARY KEY (Riv_Id, Mov_Id),

FOREIGN KEY (Riv_Id) REFERENCES REVIEWER(Reviewer_ID)
ON DELETE SET NULL ON UPDATE CASCADE,

FOREIGN KEY (Mov_Id) REFERENCES MOVIE(Movie_ID)
ON DELETE SET DEFAULT ON UPDATE CASCADE
)
 2
Author: gathila,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-11 01:18:49

Tuve el mismo problema, mi solución:

Antes:

CREATE TABLE EMPRES
( NoFilm smallint NOT NULL

  PRIMARY KEY (NoFilm)

  FOREIGN KEY (NoFilm) REFERENCES cassettes

);

Solución:

CREATE TABLE EMPRES
(NoFilm smallint NOT NULL REFERENCES cassettes,

 PRIMARY KEY (NoFilm)

);

Espero que sea de ayuda;)

 2
Author: Yacine Richthofen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-28 23:33:28

Esto también sucede cuando el tipo de las columnas no es el mismo.

Por ejemplo, si la columna a la que se refiere no tiene SIGNO INT y la columna a la que se refiere es INT, entonces obtiene este error.

 2
Author: Mozaffar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-29 06:17:56

Para MySQL (INNODB)... obtener definiciones para las columnas que desea vincular

SELECT * FROM information_schema.columns WHERE 
TABLE_NAME IN (tb_name','referenced_table_name') AND 
COLUMN_NAME  IN ('col_name','referenced_col_name')\G

Comparar y verificar ambas definiciones de columna tienen

Mismo COLUMN_TYPE (longitud), misma COLACIÓN

Podría ser útil para jugar como

set foreign_key_checks=0;
ALTER TABLE tb_name ADD FOREIGN KEY(col_name) REFERENCES ref_table(ref_column) ON DELETE ...
set foreign_key_checks=1;
 2
Author: bortunac,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-24 18:53:37

Compruebe la compatibilidad de la tabla. Por ejemplo, si una tabla es MyISAM y la otra es InnoDB, es posible que tenga este problema.

 2
Author: Dennis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-12 00:20:42

Otra razón: si usa ON DELETE SET NULL todas las columnas que se utilizan en la clave foránea deben permitir valores nulos. Alguien más descubrió esto en esta pregunta.

Desde mi punto de vista no sería un problema con respecto a la integridad de los datos, pero parece que MySQL simplemente no soporta esta característica (en 5.7).

 2
Author: robsch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:47:27

Cuando se produce este error porque la tabla referenciada utiliza el motor MyISAM, esta respuesta proporciona una forma rápida de convertir su base de datos para que todas las tablas modelo de Django utilicen InnoDB: https://stackoverflow.com/a/15389961/2950621

Es un comando de gestión de Django llamado convert_to_innodb.

 1
Author: nmgeek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:18:16

Wooo acabo de conseguirlo ! Era una mezcla de muchas respuestas ya publicadas (InnoDB, unsigned, etc.). Sin embargo, una cosa que no vi aquí es : si su FK apunta a un PK, asegúrese de que la columna de origen tenga un valor que tenga sentido. Por ejemplo, si el PK es un mediumint(8), asegúrese de que la columna de origen también contenga un mediumint(8). Eso era parte del problema para mí.

 1
Author: Chris Neve,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-05 22:16:11

Para mí eran los tipos de columna. ¡BigINT != INT.

Pero aún así no funcionó.

Así que revisé los motores. Asegúrese de que Table1 = InnoDB y Table = InnoDB
 1
Author: Chad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-10 04:05:14

Incluso yo tenía el mismo problema . Y la falla fue con el marcador "sin signo" en la tabla de FK PK

 0
Author: blueFroggy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-06-21 11:31:00

Tenga en cuenta el uso de backquotes también. Tenía en un guión la siguiente declaración

ALTER TABLE service ADD FOREIGN KEY (create_by) REFERENCES `system_user(id)`;

Pero las letras al final eran falsas. Debería haber sido:

ALTER TABLE service ADD FOREIGN KEY (create_by) REFERENCES `system_user`(`id`);

MySQL no da detalles sobre este error...

 0
Author: Olivier Faucheux,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-31 12:06:24

Experimenté este error por una razón completamente diferente. Utilicé MySQL Workbench 6.3 para crear mi Modelo de datos (awesome tool). Noté que cuando el orden de columna definido en la definición de restricción de clave foránea no se ajusta a la secuencia de columnas de la tabla, este error también se genera.

Me tomó alrededor de 4 horas de intentar todo lo demás, excepto comprobar que.

Ahora todo está funcionando bien y puedo volver a la codificación. :-)

 0
Author: Stephen Nortje,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-05 22:08:54

Otra fuente de este error es que tiene 2 o más nombres de tabla iguales que tienen los mismos nombres de clave foránea. Esto a veces le sucede a las personas que usan software de modelado y diseño, como Mysql Workbench, y luego generan el script a partir del diseño.

 0
Author: Dima Dz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-06 08:49:12

Cuando intente hacer una clave foránea al usar laravel migration

Como este ejemplo:

Tabla de usuarios

    public function up()
{
    Schema::create('flights', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name');
        $table->TinyInteger('color_id')->unsigned();
        $table->foreign('color_id')->references('id')->on('colors');
        $table->timestamps();
    });
}

Tabla de colores

    public function up()
{
    Schema::create('flights', function (Blueprint $table) {
        $table->increments('id');
        $table->string('color');
        $table->timestamps();
    });
}

A veces las propiedades no funcionaban

[PDOException]
SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint

Este error ocurrió porque la clave foránea (tipo) en [tabla de usuarios] es diferente de la clave primaria (tipo) en [tabla de colores]

Para resolver este problema debe cambiar la clave primaria en[tabla de colores]

$table->tinyIncrements('id');


Cuando se utiliza primaria clave $table->Increments('id');

Debe usar Integer como clave foránea

    $table-> unsignedInteger('fk_id');
    $table->foreign('fk_id')->references('id')->on('table_name');

Cuando se utiliza la clave primaria $table->tinyIncrements('id');

Debe usar unsignedTinyInteger como clave foránea

    $table-> unsignedTinyInteger('fk_id');
    $table->foreign('fk_id')->references('id')->on('table_name');

Cuando se utiliza la clave primaria $table->smallIncrements('id');

Debe usar unsignedSmallInteger como clave foránea

    $table-> unsignedSmallInteger('fk_id');
    $table->foreign('fk_id')->references('id')->on('table_name');

Cuando se utiliza la clave primaria $table->mediumIncrements('id');

Debe usar unsignedMediumInteger como clave foránea

    $table-> unsignedMediumInteger('fk_id');
    $table->foreign('fk_id')->references('id')->on('table_name');
 0
Author: MAHDI ABDULSAHIB,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-16 13:13:45

Sé que llego muy tarde a la fiesta, pero quiero ponerlo aquí para que esté en la lista.

Además de todos los consejos anteriores para asegurarse de que los campos están definidos de forma idéntica, y los tipos de tabla también tienen la misma intercalación, asegúrese de no cometer el error de novato de tratar de vincular campos donde los datos en el campo HIJO no están ya en el campo PADRE. Si tiene datos que están en el campo HIJO que no ha ingresado en el campo PADRE, entonces eso causa este error. Es una pena que el mensaje de error no sea un poco más útil.

Si no está seguro, haga una copia de seguridad de la tabla que tiene la Clave Foránea, elimine todos los datos y luego intente crear la Clave Foránea. Si tiene éxito, entonces usted qué hacer!

Buena suerte.

 0
Author: noowie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-02 22:04:14

Esta es una versión sutil de lo que ya se ha dicho, pero en mi caso, tenía 2 bases de datos (foo y bar). Creé foo primero y no me di cuenta de que hacía referencia a una clave foránea en bar.baz(que aún no fue creado). Cuando traté de crear bar.baz (sin claves foráneas), seguí recibiendo este error. Después de mirar alrededor por un tiempo encontré la llave foránea en foo.

Así que, en resumen, si obtiene este error, es posible que tenga una clave foránea preexistente a la tabla crear.

 0
Author: ajon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-20 04:36:52

En mi caso tuve que desactivar las comprobaciones FOREIGN KEY ya que las tablas de origen no existían.

SET FOREIGN_KEY_CHECKS=0;

 0
Author: Arvind Bhardwaj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-10-03 05:35:15

Tuve el mismo error una vez. Simplemente reinicié el servidor MySQL y arreglé el problema.

 -5
Author: b5bus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-29 05:07:15