web-dev-qa-db-fra.com

Code d'erreur: 1215. Impossible d'ajouter une contrainte de clé étrangère (clés étrangères)

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));

J'essaie d'assurer la cohérence des données entre les tables en utilisant une clé étrangère afin que le SGBD puisse vérifier les erreurs; Cependant, il semble que nous ne pouvons pas le faire pour une raison quelconque. Quelle est l'erreur et y a-t-il une alternative? De plus, lorsque je remplis une table contenant une clé étrangère, je ne peux pas remplir le champ réservé à la ou aux clés étrangères, n'est-ce pas? En outre, une clé étrangère est-elle considérée comme une clé? 

31
GEORGE Reed

Le problème le plus probable est cette ligne:

FOREIGN KEY (classLeader) REFERENCES student(studentID),

Le type de données de classLeader est VARCHAR (255). Cela doit correspondre au type de données de la colonne référencée ... student.studentID. Et bien sûr, la table student doit exister, et la colonne studentID doit exister, et la colonne studentID devrait être la clé primaire de la table étudiant (bien que je pense que MySQL autorise cette fonction à être une clé unique, plutôt qu'une clé primaire , ou même juste un index dessus.)

Dans tous les cas, ce qui manque ici est le résultat de SHOW CREATE TABLE student;


Il y a une incompatibilité de type de données.

La colonne classLeader VARCHAR(255) ne peut pas être une référence de clé étrangère à studentID INT.

Les types de données des deux colonnes doivent correspondre.

46
spencer7593

Vous obtenez cette erreur en raison de dans FOREIGN KEY (classLeader) REFERENCES student(studentID) Le type de données de studentID et classLeader est différent. Le type de données de la colonne de clé primaire et de la colonne de clé étrangère doit être identique.

Depuis le site 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.
7
Rohan

Bien que ce soit une réponse tardive, j'espère que cela aidera peu de gens.

J'ai fait face au même problème. Mais, ici, les types de données étaient également les mêmes. 

Mais, lorsque j'ai vérifié l'instruction create table, j'ai découvert qu'une table avait été créée à l'aide d'un moteur appelé "MyISAM" et qu'une autre utilisait "InnoDB".

SHOW CREATE TABLE <TABLE NAME>

Ensuite, j'ai changé le moteur des deux tables en "InnoDB" et cela a fonctionné (j'ai pu créer une clé étrangère)

3
John Prawyn

L'erreur est résolue:

Pour créer une clé étrangère pour une table comme celle-ci

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

Le code ci-dessous fonctionne bien

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

Assurez-vous que vous avez un en-tête et un pied de page dans SQL dump, sinon vous verrez toutes sortes d'erreurs lors de la restauration

L'en-tête devrait ressembler à quelque chose comme ci-dessous -:

/*!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 */;

et le pied de page devrait ressembler à quelque chose comme ci-dessous -:

/*!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 */;

J'espère que ce qui précède aide

Salutations S

0
stevensagaar

Définir le point de référence final de la clé sur 'Unique'

0
TheFatMan

Supprimez le Engine, CHARSET, COLLATE de la requête, puis passez à la caisse. Ça marche pour moi.

0
Niyas