web-dev-qa-db-fra.com

MySQL Errno 150

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

21
Sixers17

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 .

24
Ed Gibbs

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.

35
JohnL

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.
17
Riccardo Galli

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.

3
Shimon Rachlenko

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

3
Mayur Mahajan

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?

1
Ian Kenney

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,

  • Les deux tables doivent être dans le même moteur et le même jeu de caractères.
  • Les colonnes PK dans les colonnes parent et FK doivent appartenir au même type de données et au même type de classement.

J'espère que tu as une idée.

0
Sudarshani Perera

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à.

0
Duco

Assurez-vous que ce type de table est InnoDB, MyISAM ne supporte pas la clé étrangère, autant que je sache.

0
Kadir Erturk