68 votes

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.

54voto

Quassnoi Points 191041

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

Il est nécessaire de placer un FOREIGN KEY contrainte 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.

49voto

Mushtaq Hussain Points 161

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.

13voto

atomice Points 2273

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

8voto

jwilm Points 61

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

5voto

pl1nk Points 485

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

 SET FOREIGN_KEY_CHECKS = 0;
 

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