Código de error: 1215. No se puede agregar restricción de clave externa (claves externas)

CREATE DATABASE my_db; CREATE TABLE class ( classID int NOT NULL AUTO_INCREMENT, nameClass varchar(255), classLeader varchar(255), FOREIGN KEY (classLeader) REFERENCES student(studentID), PRIMARY KEY (classID)); CREATE TABLE student ( studentID int NOT NULL AUTO_INCREMENT, lastName varchar(255), firstName varchar(255), classID int, FOREIGN KEY (classID) REFERENCES class(classID), PRIMARY KEY (studentID)); 

Estoy tratando de garantizar la coherencia de los datos entre las tablas mediante el uso de una clave externa para que el DBMS pueda verificar si hay errores; sin embargo, parece que no podemos hacer eso por alguna razón. ¿Cuál es el error y hay una alternativa? Además, cuando llene una tabla que tiene una clave externa, no puedo completar el campo que está reservado para la (s) clave (s) externa (s), ¿verdad? Además, ¿se considera que una clave externa es clave?

El problema más probable es esta línea:

 FOREIGN KEY (classLeader) REFERENCES student(studentID), 

El tipo de datos de classLeader es VARCHAR (255). Eso tiene que coincidir con el tipo de datos de la columna referenciada … student.studentID . Y, por supuesto, la tabla de student debe existir, y la columna studentID debe existir, y la columna studentID debe ser la PRIMARY KEY de la tabla de estudiantes (aunque creo que MySQL permite que sea una LLAVE ÚNICA, en lugar de una LLAVE PRINCIPAL , o incluso solo tiene un índice en él).

En cualquier caso, lo que falta aquí es el resultado del SHOW CREATE TABLE student;


Hay un desajuste de tipo de datos.

La classLeader VARCHAR(255) no puede ser una referencia de clave externa a studentID INT .

Los tipos de datos de las dos columnas tienen que coincidir.

FOREIGN KEY (classLeader) REFERENCES student(studentID) este error debido a que en FOREIGN KEY (classLeader) REFERENCES student(studentID) studentID de studentID y classLeader es diferente. El tipo de datos de la columna de la clave principal y la columna de la clave externa deben ser iguales.

Desde el sitio de MySQL:

 Corresponding columns in the foreign key and the referenced key must have similar data types. The size and sign of integer types must be the same. The length of string types need not be the same. For nonbinary (character) string columns, the character set and collation must be the same. 

El error se resuelve:

Para crear una clave externa para una tabla como esta

 CREATE TABLE USERS_SO ( USERNAME VARCHAR(10) NOT NULL, PASSWORD VARCHAR(32) NOT NULL, ENABLED SMALLINT, PRIMARY KEY (USERNAME) ); 

El siguiente código funciona bien

 CREATE TABLE AUTHORITIES_SO ( USERNAME VARCHAR(10) NOT NULL, AUTHORITY VARCHAR(10) NOT NULL, FOREIGN KEY (USERNAME) REFERENCES USERS_SO(USERNAME) ); 

Aunque es una respuesta tardía, espero que ayude a pocas personas.

Enfrenté el mismo problema. Pero, aquí los tipos de datos también eran iguales.

Pero, cuando revisé la statement de crear tabla, encontré que una tabla creada usando un motor llamado “MyISAM” y otra estaba usando “InnoDB”.

 SHOW CREATE TABLE 

Luego cambié el motor de ambas tablas a “InnoDB” y funcionó (pude crear Foreign Key)

Asegúrate de tener un encabezado y un pie de página en el volcado sql; de lo contrario, verás todo tipo de errores al restaurar la base de datos.

El encabezado debe verse más o menos a continuación:

 /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; /*!40101 SET NAMES utf8 */; /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; 

y el pie de página debe verse más abajo -:

 /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; /*!40101 SET SQL_MODE=@OLD_SQL_MODE */; /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; 

Espero que lo anterior ayude

Saludos S

Establezca el punto de referencia final de la clave en ‘Único’

Retire el Engine, CHARSET, COLLATE de Query, luego realice la compra. Esto funciona para mi.