web-dev-qa-db-fra.com

Mysql. Impossible de créer la table errno 150

Je dois créer une base de données avec 2 tables dans mysql mais le script échoue avec le code d'erreur 150 (problème de clé étrangère). J'ai vérifié deux fois que les champs de clé étrangère étaient identiques sur les deux tables et je ne trouvais aucune erreur.

Voici le script:

 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL';

 DROP SCHEMA IF EXISTS `testdb`;
 CREATE SCHEMA IF NOT EXISTS `testdb` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ;
 USE `testdb`;

 DROP TABLE IF EXISTS `testdb`.`table1` ;

 CREATE  TABLE IF NOT EXISTS `testdb`.`table1` (
   `id` INT UNSIGNED NOT NULL ,
   `field1` VARCHAR(50) NULL ,
   PRIMARY KEY (`id`) )
 ENGINE = InnoDB;



 DROP TABLE IF EXISTS `testdb`.`table2` ;

 CREATE  TABLE IF NOT EXISTS `testdb`.`table2` (
   `id` INT NOT NULL AUTO_INCREMENT ,
   `field1` VARCHAR(50) NULL ,
   `date` DATE NULL ,
   `cnt` INT NULL ,
   PRIMARY KEY (`id`) ,
   INDEX `FK_table2_table1` (`field1` ASC) ,
   CONSTRAINT `FK_table2_table1`
  FOREIGN KEY (`field1`)
  REFERENCES `testdb`.`table1` (`field1` )
  ON DELETE NO ACTION
  ON UPDATE NO ACTION)
 ENGINE = InnoDB;

 SET SQL_MODE=@OLD_SQL_MODE;
 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

Je l'ai essayé sous Windows et Ubuntu avec différentes versions de Mysql et cela n'a pas fonctionné.

Des idées? Merci beaucoup.

68
David Espart

table1.field1 n'a pas d'index défini dessus.

Il est nécessaire de placer une contrainte FOREIGN KEY sur field1.

Avec ça:

 CREATE  TABLE IF NOT EXISTS `testdb`.`table1` (
   `id` INT UNSIGNED NOT NULL ,
   `field1` VARCHAR(50) NULL ,
   KEY ix_table1_field1 (field1),
   PRIMARY KEY (`id`) )
 ENGINE = InnoDB;

Tout devrait alors fonctionner comme prévu.

54
Quassnoi

En travaillant avec MySQL Workbench et MySQL 5.5.27, j'ai rencontré le même problème. Dans mon cas, le problème était lié aux champs de type INT. À tort dans une table, il s'agissait de INT UNSIGNED et dans la table de référence, il s'agissait de INT. 

50
Mushtaq Hussain

Selon la version de MySQL, vous devrez peut-être d'abord créer un index sur table1.field1.

13
atomice

Une des réponses ici suggère de désactiver la vérification de l'intégrité de la clé étrangère. C'est une mauvaise idée. Il y a deux coupables probables ici:

  • Incompatibilité de type de données entre la clé primaire référencée et la clé étrangère de référence
  • Indices. Toute clé étrangère que vous indexez doit être NOT NULL
8
jwilm

Un autre indice:

Même lorsque vos types de données semblent être identiques (dans mon cas, les deux colonnes contenaient VARCHAR(50)), cela ne suffit pas.

Vous devez également vous assurer que les deux colonnes ont la même COLLATION.

6
Alex

Encore une autre cause, bien que légèrement similaire aux autres: je faisais référence à un tableau qui s’est avéré avoir le moteur MyISAM, au lieu d’InnoDB.

5
Sherlock

MySQL lançera également cette erreur si vous saisissez mal le nom de la table de référence. J'ai tiré mes cheveux pendant un moment jusqu'à ce que je réalise que j'ai raté une lettre dans foreign key (column1) references mistyped_table(column1)

5
Cfreak

Une option (selon le cas) serait de désactiver le contrôle d'intégrité de mysql:

SET FOREIGN_KEY_CHECKS = 0;
5
pl1nk

Si rien ne fonctionne, essayez ceci:

Le nom de la clé étrangère est une copie d'une clé existante. Vérifiez que le nom de votre clé étrangère est unique dans votre base de données. Ajoutez simplement quelques caractères aléatoires à la fin du nom de votre clé pour le vérifier.

1
Arvind Bhardwaj

Si vous travaillez sur mysql workbench et que vous obtenez cette erreur pour une table de relations, une solution miracle peut être trouvée: supprimez-la et laissez-la mysql workbench la recréer pour vous. Ensuite, copiez le SQL. Correction de mon problème errno 150.

0
clinical

J'ai eu cette erreur en essayant d'utiliser une clé étrangère pour référencer un champ non unique. (qui apparemment n'est pas autorisé)

0
Matthias

Pour moi, le problème était d'utiliser CONSTRAINT dans la requête CREATE TABLE

0
Patrick Moore

Dans des cas très étranges, votre base de données peut être endommagée. Dans mon cas, je n'avais aucune clé étrangère sur la table et le seul changement de nom de la table ou de changement de moteur m'a aidé.

InnoDB était cassé, voir: https://dba.stackexchange.com/questions/86853/1025-error-on-rename-of-table-errno-150-table-was-deleted-while-tried- to-a? lq = 1

0
PiTheNumber

Dans mon cas, il s’agissait probablement d’un bogue du serveur supprimant une table portant le même nom . Suppression de tout le shcema et recréation, le problème était résolu.

0
daVe

J'utilisais MySQL workBench. Le problème est que vous ne pouvez pas utiliser le même foreign key name, ils doivent être unique. Ainsi, si plusieurs tables font référence à la même clé étrangère, un nom unique doit être attribué.

0
Earlin Thimbriel

Vous pouvez également rencontrer la même erreur lorsque vous essayez de référencer une clé composite dans votre clé étrangère. 

Par exemple:

CREATE TABLE `article` (
  `id` int(10) unsigned NOT NULL,
  `type` enum('X','Y','Z') NOT NULL,
  PRIMARY KEY (`id`,`type`)
) ENGINE InnoDB;

CREATE TABLE `t1` (
  `user_id` int(10) unsigned NOT NULL,
  `type` enum('X','Y','Z') NOT NULL,
  `article_id` int(10) unsigned NOT NULL,
  CONSTRAINT `user_access_article_ibfk_2` FOREIGN KEY (`article_id`, `type`) REFERENCES `article` (`id`, `type`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB

Dans ce cas, il est important d'utiliser le champ article_id et le champ type de la définition FK dans le même ordre que celui indiqué dans la définition de la table d'articles PRIMARY KEY.

0
crocodile2u

Si quelqu'un a toujours des problèmes avec cela, j'ai essayé toutes les solutions ci-dessus (à l'exception de SET FOREIGN_KEY_CHECKS) et rien n'a fonctionné. Le problème était que lorsque vous référencez la première table, certaines bases de données sont sensibles à la casse des noms de table. Je pense que c'est étrange, car je n'avais jamais vu cela auparavant avec MySQL, Oracle et maintenant, cela m'est arrivé sur MariaDB.

Par exemple:

Créer une table s'il n'existe pas CADASTRO_MAQUINAS ( Id VARCHAR (16), Clé primaire (Id) );

Crée une table s'il n'existe pas. INFOS ( Id_Maquina VARCHAR (16) NOT NULL, CONSTRAINT FK_infos_cadastro_maquinas La clé étrangère (Id_Maquina) fait référence à CADASTRO_MAQUINAS (Id) );

Si j'essaie de créer la deuxième table en utilisant cadastro_maquinas (minuscules) au lieu de CADASTRO_MAQUINAS, je recevrai cette erreur.

0
Vini.g.fer

Dans mon cas, une table utilisait des contraintes de clé étrangère sur une autre table qui n'existait pas encore. Cela était dû à un fichier makefile important, donc ce n'était pas aussi évident que prévu.

0
Tyler Collier

Lorsque j'ai eu ce problème, c'est parce que j'avais défini l'ID de la première table sur unsigned alors que la clé étrangère de la seconde table ne l'était pas. Les faire tous les deux unsigned l'a résolu pour moi.

0
crm

Dans mon cas, l'ancienne définition de la table, MyISAM, figurait dans l'une des tables et, bien évidemment, je ne pouvais pas lui attribuer de clé étrangère depuis une autre table. Peut-être que cela aide quelqu'un.

Cela peut donc arriver à cause d'incohérences entre les définitions de deux bases de données/champs, essayez de vérifier:

Field Type
Field Collation
Table Engine
0
Radamanf

Créez toujours d'abord les tables maître/parent, puis créez vos tables détail/enfants.

0
Ruwan Jayalath

J'ai eu une erreur similaire sur l'une de mes tables. Lorsque la colonne cochée était différente, ce qui fonctionnait une fois a modifié le même type de coloration des deux colonnes.

Après avoir lu la plupart des solutions suggérées ici. J'ai juste pensé qu'il pourrait être utile de simplement énumérer toutes les possibilités qui pourraient générer cette erreur.

1, Vérifiez le CASE de la colonne 2, Vérifiez la COLLATION de colonnes 3, Vérifiez si une clé est créée dans les deux tableaux pour la colonne (Unique, Primaire)

0
bumblebee