Question

Je dois créer une base de données avec deux tables de MySQL, mais le script échoue avec errno 150 (problème clé étrangère). J'ai vérifié les champs clés étrangers être les mêmes sur les deux tables, et je ne peux trouver 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é dans Windows et Ubuntu avec différentes versions de MySQL et ne fonctionne pas.

Toutes les idées?

Était-ce utile?

La solution

table1.field1 n'a pas d'index défini sur elle.

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

Avec ceci:

 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.

Autres conseils

En travaillant avec MySQL Workbench et MySQL 5.5.27, j'ai rencontré le même problème. Dans mon numéro de cas était avec des champs de type INT. Dans une table de façon erronée était INT et UNSIGNED dans le tableau faisant référence était INT.

En fonction de la version de MySQL, vous devrez peut-être créer un index sur table1.field1 premier.

L'une des réponses ici suggère de désactiver le contrôle d'intégrité clé étrangère. C'est une mauvaise idée. Il y a deux coupables probables ici:

  • incompatibilité de type de données entre référence clé primaire référencée et clé étrangère
  • Indices. Toutes les clés étrangères qui vous index doit être NOT NULL

Un autre indice:

Même lorsque vos types de données semblent être les mêmes - dans mon cas, les deux colonnes ont VARCHAR(50) -. Cela ne suffit pas

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

Pourtant, une autre cause, bien que légèrement semblable à d'autres. Je faisais référence à une table qui se est avéré avoir le moteur MyISAM, InnoDB au lieu de

MySQL va également lancer cette erreur si votre nom mistyping de la table faisant référence. J'ai tiré mes cheveux pendant un certain temps jusqu'à ce que je compris que je manqué une lettre dans foreign key (column1) references mistyped_table(column1)

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

SET FOREIGN_KEY_CHECKS = 0;

Si rien ne fonctionne, essayez ceci:

Le nom de clé étrangère est une copie d'une clé déjà existante. Vérifiez que le nom de votre clé étrangère est unique dans votre base de données. Il suffit d'ajouter quelques caractères aléatoires à la fin de votre nom clé pour tester cela.

Dans mon cas, une table utilisait les clés étrangères sur une autre table qui n'existait pas encore. Cela se passait en raison d'une grande makefile, donc il n'a pas été aussi évident que je l'aurais prévu.

Dans cas où quelqu'un est toujours des problèmes avec cela, j'ai essayé toutes les solutions ci-dessus (sauf pour SET FOREIGN_KEY_CHECKS) et rien ne fonctionnait. Le problème est que lorsque vous faites référence à la première table, certaines bases de données sont sensibles à la casse sur les noms de table. Je pense que c'est bizarre puisque je ne ai jamais vu auparavant sur MySQL, Oracle et maintenant cela est arrivé pour moi sur MariaDB.

Par exemple:

Créer table si existe pas CADASTRO_MAQUINAS ( Id VARCHAR (16), Clé primaire (Id) );

Créer un tableau if not exists INFOS ( Id_Maquina VARCHAR (16) NOT NULL, CONTRAINTE FK_infos_cadastro_maquinas clé étrangère (Id_Maquina) Références CADASTRO_MAQUINAS (Id) );

Si je tente de créer la deuxième table à l'aide cadastro_maquinas (cas inférieurs) au lieu de CADASTRO_MAQUINAS, je recevrai cette erreur.

J'utilisais MySQL workBench. La question est que vous ne pouvez pas utiliser le même foreign key name, ils doivent être unique. Donc, si plus d'une table fera référence à la même clé étrangère, chaque fois il doit y avoir un nom de unique donné.

J'ai eu une erreur semblable sur un de mes tableaux. Lorsque la colonne cochée Collation était différente, ce qui a changé une fois les deux travaillées colonnes du même type Collation.

Après avoir lu la plupart de la solution proposée ici. Je pensais juste que ce pourrait être utile si je liste juste en bas de toutes les possibilités qui pourraient jeter cette erreur.

1, Vérifiez CAS de la colonne 2, des colonnes Vérifier COLLATIONNEMENT 3, Vérifiez s'il y a une clé créée dans les deux tables de la colonne (unique, primaire)

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

Donc cela peut se produire en raison d'incohérences entre les deux bases de données / champs définitions tentent de vérifier:

Field Type
Field Collation
Table Engine

Pour moi, le problème avec l'utilisation CONSTRAINT dans la requête CREATE TABLE.

Vous pouvez également rencontrer la même erreur lors d'une tentative 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 article_id et champ de type dans la définition FK dans le même ordre que dans la définition de la table article de clé primaire.

Dans mon cas était probablement un bug de serveur laissant tomber une table avec le même nom. Laissant tomber toute shcema et recréant résolu le problème.

Dans des cas très étranges votre base de données pourrait être cassé. Dans mon cas, je ne l'ai pas de clé étrangère sur la table et le seul changement de nom de la table ou de changer le moteur secouru.

Chassé InnoDB a été cassé, voir: https://dba.stackexchange.com/questions/86853/1025-error-on-rename-of-table-errno-150-table-was-deleted ? -Tout à un tried-lq = 1

Si vous travaillez sur table de travail mysql et vous obtenez cette erreur pour une table de relation il peut y avoir une solution rapide pour vous: il suffit de le supprimer et laisser établi mysql recréent pour vous. Ensuite, copiez le sql. Correction mon problème errno 150.

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

Quand j'ai eu ce problème, il est parce que j'avais mis l'identifiant dans la première table à unsigned alors que la clé étrangère dans la seconde table était pas. ce qui les rend à la fois unsigned fixé pour moi.

Toujours créer des tables maîtres / parents d'abord, puis créer vos détails / tables enfant.

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