una secundaria restricción puede foreign fila falla extranjera externa error constraint clave cannot agregar adicionar actualizar mysql sql database

secundaria - error 1215 mysql



MySQL: ERROR 1215(HY000): No se puede agregar una restricción de clave externa (13)

ERROR 1215 (HY000): No se puede agregar una restricción de clave externa

También vale la pena señalar que aparece este error cuando el tipo de la columna que es una clave externa en otro capaz no coincide explícitamente con la columna en la tabla correcta.

Por ejemplo:

alter table schoolPersons add index FKEF5AB5E532C8FBFA (student_id), add constraint FKEF5AB5E532C8FBFA foreign key (student_id) references student (id); ERROR 1215 (HY000): Cannot add foreign key constraint

Esto se debió a que el campo student_id se definió como:

mysql> desc schoolPersons; +--------------------+------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +--------------------+------------+------+-----+---------+----------------+ | student_id | bigint(20) | YES | | NULL | |

mientras que el campo de id en la tabla de student se definió como:

mysql> desc persons; +--------------+----------------------+------+-----+-------------------+-----------------+ | Field | Type | Null | Key | Default | Extra | +--------------+----------------------+------+-----+-------------------+-----------------+ | id | int(10) unsigned | NO | PRI | NULL | auto_increment |

El bigint(20) (generado desde Java long por hibernación) no es compatible con int(10) unsigned (Java int ).

He leído Conceptos del sistema de bases de datos , 6ª edición, Silberschatz . Voy a implementar el sistema de base de datos de la universidad que se muestra en el capítulo 2 sobre OS X en MySQL. Pero me cuesta crear el course la mesa. el department mesa parece

mysql> select * from department -> ; +------------+----------+-----------+ | dept_name | building | budget | +------------+----------+-----------+ | Biology | Watson | 90000.00 | | Comp. Sci. | Taylor | 100000.00 | | Elec. Eng. | Taylor | 85000.00 | | Finance | Painter | 120000.00 | | History | Painter | 50000.00 | | Music | Packard | 80000.00 | | Physics | Watson | 70000.00 | +------------+----------+-----------+ mysql> show columns from department -> ; +-----------+---------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------+---------------+------+-----+---------+-------+ | dept_name | varchar(20) | NO | PRI | | | | building | varchar(15) | YES | | NULL | | | budget | decimal(12,2) | YES | | NULL | | +-----------+---------------+------+-----+---------+-------+

Crear el course la tabla provoca el siguiente error.

mysql> create table course -> (course_id varchar(7), -> title varchar (50), -> dept_name varchar(20), -> credits numeric(2,0), -> primary key(course_id), -> foreign key (dept_name) references department); ERROR 1215 (HY000): Cannot add foreign key constraint

Después de buscar en Google la restricción de clave externa, acabo de enterarme de que la palabra ''restricción de clave externa'' indica que los datos de la columna de clave externa en el course la tabla deben existir en la columna de clave principal del department tabla. Pero debería haber encontrado este error al insertar datos.

Si no es así, ¿por qué el autor me hace ejecutar esa declaración SQL?

Si realmente ejecuto una declaración SQL errónea, ¿tengo que designar dept_name en la tabla del curso como clave externa después de insertar algunos datos?

EDITAR : escribir set foreign_key_checks=0 en mysql> no corrige el error.

------------------------ LATEST FOREIGN KEY ERROR ------------------------ 2013-09-21 16:02:20 132cbe000 Error in foreign key constraint of table university/course: foreign key (dept_name) references department): Syntax error close to: ) mysql> set foreign_key_checks=0 -> ; Query OK, 0 rows affected (0.00 sec) mysql> create table course -> (course_id varchar(7), -> title varchar(50), -> dept_name varchar(20), -> credits numeric(2,0), -> primary key(course_id), -> foreign key (dept_name) references department); ERROR 1215 (HY000): Cannot add foreign key constraint


No resuelvo el problema como tú. Pero me sale el mismo mensaje de ERROR. Así que lo marqué aquí para conveniencia de los demás.

Compruebe el conjunto de caracteres de dos tablas si el tipo de columna es char o varchar . Uso un charset=gbk , pero creo una nueva tabla cuyo charset=utf8 predeterminado charset=utf8 . Así que el conjunto de caracteres no es lo mismo.

ERROR 1215 (HY000): Cannot add foreign key constraint

Para resolverlo es utilizar el mismo juego de caracteres. Por ejemplo, utf8 .


A continuación el código funcionó para mí

set @@foreign_key_checks=0; ALTER TABLE `table1` ADD CONSTRAINT `table1_fk1` FOREIGN KEY (`coloumn`) REFERENCES `table2` (`id`) ON DELETE CASCADE;


Cuando recibe este mensaje de error vago, puede encontrar el error más específico ejecutando

SHOW ENGINE INNODB STATUS;

Las razones más comunes son que al crear una clave externa, tanto el campo referenciado como el campo de clave externa deben coincidir:

  • El motor debe ser el mismo, por ejemplo, InnoDB.
  • El tipo de datos debe ser el mismo, y con la misma longitud.
    por ejemplo, VARCHAR (20) o INT (10) NO FIRMADO
  • La colación debe ser la misma. por ejemplo, utf8
  • Único : la clave externa debe referirse al campo que es único (generalmente privado) en la tabla de referencia.

Otra causa de este error es:
Ha definido una condición SET NULL aunque algunas de las columnas están definidas como NOT NULL.


La sintaxis de FOREIGN KEY para CREATE TABLE se estructura de la siguiente manera:

FOREIGN KEY (index_col_name) REFERENCES table_name (index_col_name,...)

Así que tu MySQL DDL debería ser:

create table course ( course_id varchar(7), title varchar(50), dept_name varchar(20), credits numeric(2 , 0 ), primary key (course_id), FOREIGN KEY (dept_name) REFERENCES department (dept_name) );

Además, en la tabla de department , dept_name debe ser VARCHAR(20)

Se puede encontrar más información en la documentación de MySQL.


No veo a nadie que indique esto explícitamente y tuve este mismo mensaje de error y mi problema fue que estaba tratando de agregar una clave externa a una tabla TEMPORAL. Que no está permitido como se indica en el manual

Las relaciones de clave externa implican una tabla principal que contiene los valores de datos centrales y una tabla secundaria con valores idénticos que apuntan a su principal. La cláusula FOREIGN KEY se especifica en la tabla secundaria. Las tablas padre e hijo deben usar el mismo motor de almacenamiento. No deben ser tablas TEMPORALES.

(énfasis mío)


Solo agregue ''unsigned'' para la restricción FOREIGN

`FK` int(11) unsigned DEFAULT NULL,


Tal vez sus columnas dept_name tienen diferentes conjuntos de caracteres.

Podrías intentar alterar uno o ambos:

ALTER TABLE department MODIFY dept_name VARCHAR(20) CHARACTER SET utf8; ALTER TABLE course MODIFY dept_name VARCHAR(20) CHARACTER SET utf8;


También es posible obtener este error si la clave externa no es una clave principal dentro de su propia tabla.

Hice ALTER TABLE y eliminé accidentalmente el estado de la clave principal de una columna y obtuve este error.


También me encontré con el mismo problema. No estoy seguro de por qué funciona, pero sí funciona: intente agregar ENGINE INNODB después de la consulta de creación.

mysql> create table course -> (course_id varchar(7), -> title varchar (50), -> dept_name varchar(20), -> credits numeric(2,0), -> primary key(course_id), -> foreign key (dept_name) references department) ENGINE INNODB;


Vale la pena señalar que este error también puede ocurrir si la tabla o columna de destino que está utilizando en la parte de REFERENCIAS simplemente no existe.


CONSTRAINT vendor_tbfk_1 FOREIGN KEY (V_CODE) REFERENCES vendor (V_CODE) ON UPDATE CASCADE

así es como podría ser ... mire la parte de la columna de referencia. (V_code)


foreign key (dept_name) references department

Esta sintaxis no es válida para MySQL. En su lugar debería ser:

foreign key (dept_name) references department(dept_name)

MySQL requiere dept_name para ser usado dos veces . Una vez para definir la columna externa, y una vez para definir la columna primaria.

13.1.17.2. Usando restricciones de FOREIGN KEY

... [la] sintaxis esencial para una definición de restricción de clave externa en una CREATE TABLE o ALTER TABLE tiene el siguiente aspecto:

[CONSTRAINT [symbol]] FOREIGN KEY [index_name] (index_col_name, ...) REFERENCES tbl_name (index_col_name, ...) [ON DELETE reference_option] [ON UPDATE reference_option] reference_option: RESTRICT | CASCADE | SET NULL | NO ACTION