Erreur MySql 150 - Clés étrangères
-
05-07-2019 - |
Question
Lorsque j'exécute les deux requêtes suivantes (je les ai réduites à une nécessité absolue):
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'obtiens 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.
La solution
Si vous recréez une table qui était abandonné, il doit avoir une définition qui est conforme à la clé étrangère contraintes le référençant. Il doit avoir les bons noms et types de colonnes, et il doit avoir des index sur le clés référencées, comme indiqué précédemment. Si ceux-ci ne sont pas satisfaits, renvoie MySQL numéro d'erreur 1005 et fait référence à 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 d'être correct.
Modifier: à partir de la même page -
Les deux tables doivent être des tables InnoDB et non des tables TEMPORARY.
Autres conseils
Vous pouvez utiliser la commande AFFICHER LE STATUT DE L'INNODB MOTEUR
pour obtenir des informations plus spécifiques sur l'erreur.
Cela vous donnera 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'.
Pour créer une clé étrangère,
- la colonne principale et la colonne de référence doivent avoir la même définition.
- 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;
J'ai eu le même problème, pour ceux qui ont cela aussi:
vérifiez 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
:
Outre de nombreuses autres raisons de se retrouver avec MySql Error 150 (lors de l’utilisation de InnoDB), l’une des raisons probables est le KEY
non défini dans la commande create de la table contenant le nom de la colonne référencée. en tant que clé étrangère dans la table relative.
Disons que l'instruction create de la table principale est -
CREATE TABLE 'table_masters' (
& nbsp; 'id' int (10) NON NULL AUTO_INCREMENT,
& nbsp; 'record_id' char (10) NON NUL,
& nbsp; 'nom' varchar (50) NOT NULL DEFAULT '',
& nbsp; 'adresse' varchar (200) NOT NULL DEFAULT '',
& nbsp; PRIMARY KEY ('id')
) ENGINE = InnoDB DEFAULT CHARSET = utf8;
et la syntaxe de création de la table relative_table dans laquelle la contrainte de clé étrangère est définie à partir de la table primaire -
CREATE TABLE 'table_relatif' (
& nbsp; 'id' int (10) NON NULL AUTO_INCREMENT,
& nbsp; 'salaire' int (10) NOT NULL DEFAULT '',
& nbsp; 'grade' char (2) NOT NULL DEFAULT '',
& nbsp; 'record_id' char (10) DEFAULT NULL,
& nbsp; PRIMARY KEY ('id'),
& nbsp; CONSTRAINT 'fk_slave_master' FOREIGN KEY ('record_id') REFERENCES 'master' ('record_id')
) ENGINE = InnoDB DEFAULT CHARSET = utf8;
Ce script va définitivement se terminer par l'erreur MySql 150 si vous utilisez InnoDB.
Pour résoudre ce problème, nous devons ajouter un KEY
pour la colonne record_id
de la table master_table
, puis une référence dans le code table_relative
à utiliser comme clé étrangère.
Enfin, l'instruction de création pour la master_table
sera -
CREATE TABLE 'table_masters' (
& nbsp; 'id' int (10) NON NULL AUTO_INCREMENT,
& nbsp; 'record_id' char (10) NON NUL,
& nbsp; 'nom' varchar (50) NOT NULL DEFAULT '',
& nbsp; 'adresse' varchar (200) NOT NULL DEFAULT '',
& nbsp; PRIMARY KEY ('id'),
& nbsp; KEY 'ID_enregistrement' ('ID_enregistrement')
) ENGINE = InnoDB DEFAULT CHARSET = utf8;
J'ai eu le même problème et la raison en était la "collation". des colonnes était différent. L'un était latin1 tandis que l'autre était utf8
Cela peut également se produire si vous n'avez pas donné le nom de colonne correct après "références". mot clé.