Je crée quelques tables simples et je ne peux pas me passer de cette erreur de clé étrangère et je ne sais pas pourquoi. Voici le script ci-dessous.
create TABLE Instructors (
ID varchar(10),
First_Name varchar(50) NOT NULL,
Last_Name varchar(50) NOT NULL,
PRIMARY KEY (ID)
);
create table Courses (
Course_Code varchar(10),
Title varchar(50) NOT NULL,
PRIMARY KEY (Course_Code)
);
create table Sections (
Index_No int,
Course_Code varchar(10),
Instructor_ID varchar(10),
PRIMARY KEY (Index_No),
FOREIGN KEY (Course_Code) REFERENCES Courses(Course_Code)
ON DELETE cascade
ON UPDATE cascade,
FOREIGN KEY (Instructor_ID) REFERENCES Instructors(ID)
ON DELETE set default
);
Code d'erreur: 1005. Impossible de créer la table '336_project.sections' (errno: 150)
Mes types de données semblent identiques et la syntaxe semble correcte. Quelqu'un peut-il signaler ce que je ne vois pas ici?
J'utilise MySQL Workbench 5.2
Si vous utilisez le moteur InnoDB, le ON DELETE SET DEFAULT
est votre problème. Voici un extrait du manuel:
Bien que SET DEFAULT soit autorisé par le serveur MySQL, il est rejeté comme invalide par InnoDB. Les instructions CREATE TABLE et ALTER TABLE utilisant cette clause ne sont pas autorisées pour les tables InnoDB.
Vous pouvez utiliser ON DELETE CASCADE
ou ON DELETE SET NULL
, mais pas ON DELETE SET DEFAULT
. Il y a plus d'informations ici .
Cette erreur se produit également si vous associez des colonnes de types différents, par exemple. int dans la table source et BigInt dans la table de destination.
Tu peux courir
SHOW ENGINE INNODB STATUS
lire la raison de l'échec dans un format lisible par l'homme
par exemple.
------------------------
LATEST FOREIGN KEY ERROR
------------------------
150331 15:51:01 Error in foreign key constraint of table foobar/#sql-413_81:
FOREIGN KEY (`user_id`) REFERENCES `foobar`.`users`(`id`) ON DELETE SET NULL ON UPDATE CASCADE:
You have defined a SET NULL condition though some of the columns are defined as NOT NULL.
Cela peut également être le cas si vous ne spécifiez pas du tout le ON DELETE
mais essayez de référencer une table MYISAM à partir d'une table InnoDB:
CREATE TABLE `table1`(
`id` INT UNSIGNED NOT NULL,
`name` VARCHAR(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MYISAM CHARACTER SET UTF8;
CREATE TABLE `table2`(
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`table1_id` INT UNSIGNED NOT NULL,
`some_value` VARCHAR(255) NOT NULL,
PRIMARY KEY (`id`),
KEY `fk_table1_id`(`table1_id`),
CONSTRAINT FOREIGN KEY (`table1_id`) REFERENCES `table1`(`id`)
) ENGINE=INNODB CHARACTER SET UTF8;
Ce qui précède lancera errno 150 . Il faut aussi changer la première table en InnoDB pour que cela fonctionne.
Afin de créer un FOREIGN KEY
en référence à une autre table, les clés des deux tables doivent être PRIMARY KEY
et avoir le même type de données.
Dans vos sections de table, PRIMARY KEY
est de type de données différent i.e INT
mais dans une autre table, il est de type i.e VARCHAR
.
Il échoue sur le
ON DELETE set default
Je n'ai jamais vu cela auparavant et je ne le vois pas non plus dans les manuels (mais il est tard)
Mettre à jour
je viens de voir cela dans le manuel
Bien que SET DEFAULT soit autorisé par le serveur MySQL, il est rejeté en tant que invalide par InnoDB. Instructions CREATE TABLE et ALTER TABLE utilisant cette méthode Les clauses ne sont pas autorisées pour les tables InnoDB.
Je suppose que vous utilisez peut-être des tables InnoDB?
Ici le problème est dans le moteur de base de données (table1 MYISAM
et table2 ENGINE
) . Pour définir les clés étrangères,
J'espère que tu as une idée.
Par souci d'exhaustivité, vous obtiendrez également cette erreur si vous faites une référence étrangère à une table qui n'est pas définie à ce moment-là.
Assurez-vous que ce type de table est InnoDB, MyISAM ne supporte pas la clé étrangère, autant que je sache.