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.

0voto

Kangur Points 2412

Dans mon cas, cela était dû au fait que le champ qui était un champ de clé étrangère avait un nom trop long, c'est-à-dire foreign key (some_other_table_with_long_name_id) . Essayez quelque chose de plus court. Le message d'erreur est un peu trompeur dans ce cas.

De plus, comme @Jon l'a mentionné plus tôt, les définitions des champs doivent être identiques (attention aux unsigned sous-type).

0voto

Ralph Points 42744

Lorsque la contrainte de clé étrangère est basée sur varchar alors, en plus de la liste fournie par marv-el le site La colonne cible doit avoir une contrainte unique.

0voto

Rick James Points 15994

(Notes secondaires trop grandes pour un commentaire)

Il n'y a pas besoin d'un AUTO_INCREMENT id dans une table de correspondance ; supprimez-le.

Changez le PRIMARY KEY a (role_id, role_group_id) (dans l'un ou l'autre ordre). Les accès seront ainsi plus rapides.

Puisque vous voulez probablement cartographier les deux directions, ajoutez également un INDEX avec ces deux colonnes dans l'ordre inverse. (Il n'est pas nécessaire de le faire UNIQUE .)

Plus de conseils : http://mysql.rjweb.org/doc.php/index_cookbook_mysql#speeding_up_wp_postmeta

0voto

user11949964 Points 121

Exécuter la ligne ci-dessous avant de créer la table : SET FOREIGN_KEY_CHECKS = 0 ;

L'option FOREIGN_KEY_CHECKS spécifie s'il faut ou non vérifier les contraintes de clés étrangères pour les tables InnoDB.

-- Spécifier de vérifier les contraintes de clé étrangère (par défaut)

SET FOREIGN_KEY_CHECKS = 1;

-- Ne pas vérifier les contraintes de clé étrangère

SET FOREIGN_KEY_CHECKS = 0 ;

Quand l'utiliser : Désactiver temporairement les contraintes référentielles (définir FOREIGN_KEY_CHECKS à 0) est utile lorsque vous devez recréer les tables et charger les données dans n'importe quel ordre parent-enfant.

-1voto

韩向飞 Points 59

J'ai rencontré le même problème, mais je vérifie que je n'avais pas la table parente. Donc j'ai juste édité la migration parent avant la migration enfant. Il suffit de le faire.

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