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.

Était-ce utile?

La solution

De FOREIGN KEY Contraintes

  

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,

  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;

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top