web-dev-qa-db-fra.com

Erreur MySql 150 - Clés étrangères

Lorsque j'exécute les deux requêtes suivantes (je les ai réduites au strict nécessaire):

mysql> CREATE TABLE foo(id INT PRIMARY KEY);
Query OK, 0 rows affected (0.01 sec)

mysql> CREATE TABLE bar ( id INT, ref INT, FOREIGN KEY (ref) REFERENCES foo(id)) ENGINE InnoDB;

J'ai l'erreur suivante: ERREUR 1005 (HY000): impossible de créer la table './test/bar.frm' (numéro d'erreur: 150)

Où le **** est mon erreur? Je ne l'ai pas trouvé en regardant ça depuis une demi-heure.

17
Martin Thurau

De FOREIGN KEY Contraintes

Si vous recréez une table qui a été supprimée, sa définition doit être conforme aux contraintes de la clé étrangère la référant. Il doit avoir les bons noms et types de colonnes et des index sur les clés référencées, comme indiqué précédemment. Si ceux-ci ne sont pas satisfaits, MySQL renvoie le numéro d'erreur 1005 et renvoie à l'erreur 150 dans le message d'erreur.

Mon soupçon est que c'est parce que vous n'avez pas créé foo en tant que InnoDB, car tout le reste a l'air correct.

Edit: de la même page -

Les deux tables doivent être des tables InnoDB et non des tables TEMPORARY.

30
Greg

Vous pouvez utiliser la commande SHOW ENGINE INNODB STATUS pour obtenir des informations plus spécifiques sur l'erreur.

Vous obtiendrez un résultat avec une colonne Status contenant beaucoup de texte.

Recherchez la section intitulée LATEST FOREIGN KEY ERROR qui pourrait par exemple ressembler à ceci:

------------------------
LATEST FOREIGN KEY ERROR
------------------------
190215 11:51:26 Error in foreign key constraint of table `mydb1`.`contacts`:
Create  table `mydb1`.`contacts` with foreign key constraint failed. You have defined a SET NULL condition but column 'domain_id' is defined as NOT NULL in ' FOREIGN KEY (domain_id) REFERENCES domains (id) ON DELETE SET NULL ON UPDATE CASCADE,
    CONSTRAINT contacts_teams_id_fk FOREIGN KEY (team_id) REFERENCES teams (id) ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT' near ' ON DELETE SET NULL ON UPDATE CASCADE,
    CONSTRAINT contacts_teams_id_fk FOREIGN KEY (team_id) REFERENCES teams (id) ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT'.
11
user2906840

Pour créer une clé étrangère,

  1. la colonne principale et la colonne de référence doivent avoir la même définition.
  2. le moteur des deux tables doit être InnoDB.

Vous pouvez modifier le moteur de table à l'aide de cette commande, veuillez effectuer la sauvegarde avant d'exécuter cette commande.

alter table [nom de la table] ENGINE = InnoDB;

4
Suyash Jain

Mis à part de nombreuses autres raisons de se retrouver avec MySql Error 150 (lors de l’utilisation de InnoDB), l’une des raisons probables est la variable KEY dans la commande create de la table contenant le nom de la colonne référencée comme clé étrangère dans la table relative.

Disons que l'instruction create de la table principale est -

CREATE TABLE 'master_table' (
 'id' int(10) NOT NULL AUTO_INCREMENT,
 'record_id' char(10) NOT NULL,
 'name' varchar(50) NOT NULL DEFAULT '',
 'address' varchar(200) NOT NULL DEFAULT '',
 PRIMARY KEY ('id')
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

et la syntaxe de création pour la table relative_table où la contrainte de clé étrangère est définie à partir de la table primaire -

CREATE TABLE 'relative_table' (
 'id' int(10) NOT NULL AUTO_INCREMENT,
 'salary' int(10) NOT NULL DEFAULT '',
 'grade' char(2) NOT NULL DEFAULT '',
 'record_id' char(10) DEFAULT NULL,
 PRIMARY KEY ('id'),
 CONSTRAINT 'fk_slave_master' FOREIGN KEY ('record_id') REFERENCES 'master' ('record_id')
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Ce script va certainement se terminer par l'erreur MySql 150 si vous utilisez InnoDB.

Pour résoudre ce problème, nous devons ajouter une variable KEY à la colonne record_id dans la table master_table, puis une référence dans la table relative_table à utiliser comme clé étrangère.

Enfin, l'instruction create pour le master_table sera:

CREATE TABLE 'master_table' (
 'id' int(10) NOT NULL AUTO_INCREMENT,
 'record_id' char(10) NOT NULL,
 'name' varchar(50) NOT NULL DEFAULT '',
 'address' varchar(200) NOT NULL DEFAULT '',
 PRIMARY KEY ('id'),
 KEY 'record_id' ('record_id')
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

1
Madhab Chandra Pal

J'ai eu le même problème, pour ceux qui ont cela aussi:

vérifier le nom de la table référencée

J'avais oublié le 's' à la fin du nom de ma table

p.ex. table Client -> Clients

:)

1
webmaster

Cela peut également arriver si vous n'avez pas donné le nom de colonne correct après le mot clé "references".

0
Ajay Sharma

J'ai eu très même problème et la raison était la "collation" des colonnes était différente. L'un était latin1 tandis que l'autre était utf8

0
Hamed J.I