106 votes

MySQL Création de tables avec des clés étrangères donnant errno : 150

J'essaie de créer une table dans MySQL avec deux clés étrangères, qui font référence aux clés primaires de deux autres tables, mais j'obtiens une erreur errno : 150 et la table ne sera pas créée.

Voici le SQL pour les 3 tables :

CREATE TABLE role_groups (
  `role_group_id` int(11) NOT NULL `AUTO_INCREMENT`,
  `name` varchar(20),
  `description` varchar(200),
  PRIMARY KEY (`role_group_id`)
) ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS `roles` (
  `role_id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50),
  `description` varchar(200),
  PRIMARY KEY (`role_id`)
) ENGINE=InnoDB;

create table role_map (
  `role_map_id` int not null `auto_increment`,
  `role_id` int not null,
  `role_group_id` int not null,
  primary key(`role_map_id`),
  foreign key(`role_id`) references roles(`role_id`),
  foreign key(`role_group_id`) references role_groups(`role_group_id`)
) engine=InnoDB;

Toute aide serait grandement appréciée.

1voto

wholenewstrain Points 41

Cela se produit généralement lorsque vous essayez de créer un fichier source dans une base de données existante. Commencez par supprimer toutes les tables (ou la base de données elle-même). Et ensuite, créez le fichier source avec SET foreign_key_checks = 0; au début et SET foreign_key_checks = 1; à la fin.

1voto

Tom Points 59

J'ai trouvé une autre raison pour laquelle cela échoue... les noms de table sensibles à la casse.

Pour cette définition du tableau

CREATE TABLE user (
  userId int PRIMARY KEY AUTO_INCREMENT,
  username varchar(30) NOT NULL
) ENGINE=InnoDB;

Cette définition de la table fonctionne

CREATE TABLE product (
  id int PRIMARY KEY AUTO_INCREMENT,
  userId int,
  FOREIGN KEY fkProductUser1(userId) REFERENCES **u**ser(userId)
) ENGINE=InnoDB;

alors que celui-ci échoue

CREATE TABLE product (
  id int PRIMARY KEY AUTO_INCREMENT,
  userId int,
  FOREIGN KEY fkProductUser1(userId) REFERENCES User(userId)
) ENGINE=InnoDB;

Le fait qu'il fonctionne sous Windows et échoue sous Unix m'a pris quelques heures à comprendre. J'espère que cela aidera quelqu'un d'autre.

1voto

MySQL Workbench 6.3 pour Mac OS.

Problème : errno 150 sur la table X lors d'une tentative de Forward Engineering sur un diagramme DB, 20 sur 21 ont réussi, 1 a échoué. Si les FK de la table X étaient supprimés, l'erreur se déplaçait vers une autre table qui n'était pas en échec auparavant.

J'ai changé le moteur de toutes les tables en myISAM et cela a fonctionné parfaitement.

enter image description here

0voto

SystemParadox Points 1864

Il faut également vérifier que vous n'opérez pas accidentellement sur la mauvaise base de données. Cette erreur se produira si la table étrangère n'existe pas. Pourquoi MySQL doit-il être si énigmatique ?

0voto

Raza Farooq Points 57

Assurez-vous que les clés étrangères ne sont pas listées comme uniques dans le parent. J'ai eu ce même problème et je l'ai résolu en le délimitant comme non unique.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X