Code d'erreur: 1005. Impossible de créer la table «…» (numéro d'erreur: 150)

103

J'ai cherché une solution à ce problème sur Internet et vérifié les questions de Stack Overflow, mais aucune des solutions n'a fonctionné pour mon cas.

Je veux créer une clé étrangère de la table sira_no à metal_kod.

ALTER TABLE sira_no
    ADD CONSTRAINT METAL_KODU FOREIGN KEY(METAL_KODU)
    REFERENCES metal_kod(METAL_KODU)
    ON DELETE SET NULL
    ON UPDATE SET NULL ;

Ce script renvoie:

Error Code: 1005. Can't create table 'ebs.#sql-f48_1a3' (errno: 150)

J'ai essayé d'ajouter un index à la table référencée:

CREATE INDEX METAL_KODU_INDEX ON metal_kod (METAL_KODU);

J'ai vérifié METAL_KODU sur les deux tables (charset et collation), mais je n'ai pas trouvé de solution à ce problème. Comment puis-je résoudre ce problème?

Voici la table metal_kod:

METAL_KODU    varchar(4)    NO    PRI
DURUM    bit(1)    NO
METAL_ISMI    varchar(30)    NO
AYAR_YOGUNLUK    smallint(6)    YES        100
Lamostreta
la source
Pouvez-vous montrer le schéma de la metal_kodtable ... quel champ de cette table doit faire référence à la clé étrangère?
Manse

Réponses:

271

Code d'erreur: 1005 - il y a une mauvaise référence de clé primaire dans votre code

Cela est généralement dû à un champ de clé étrangère référencé qui n'existe pas. Il se peut que vous ayez une faute de frappe, ou cochez la case, il devrait être le même, ou il y a une incompatibilité de type de champ. Les champs liés à une clé étrangère doivent correspondre exactement aux définitions.

Certaines causes connues peuvent être:

  1. Le type et / ou la taille des deux champs clés ne correspondent pas exactement. Par exemple, si l'un est INT(10)le champ clé doit l'être INT(10)aussi et non INT(11)ou TINYINT. Vous souhaiterez peut-être confirmer la taille du champ en utilisant, SHOW CREATE TABLEcar le navigateur de requêtes s'affiche parfois uniquement INTEGERpour les deux INT(10)et INT(11). Vous devez également vérifier que l'un ne l'est pas SIGNEDet que l'autre l'est UNSIGNED. Ils doivent tous deux être exactement les mêmes.
  2. L'un des champs de clé que vous essayez de référencer n'a pas d'index et / ou n'est pas une clé primaire. Si l'un des champs de la relation n'est pas une clé primaire, vous devez créer un index pour ce champ.
  3. Le nom de la clé étrangère est un double d'une clé déjà 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 de votre nom de clé pour tester cela.
  4. Une de vos tables ou les deux sont une MyISAMtable. Pour utiliser des clés étrangères, les tables doivent être toutes les deux InnoDB. (En fait, si les deux tables le sont, MyISAMvous n'obtiendrez pas de message d'erreur - il ne créera tout simplement pas la clé.) Dans le navigateur de requêtes, vous pouvez spécifier le type de table.
  5. Vous avez spécifié une cascade ON DELETE SET NULL, mais le champ clé correspondant est défini sur NOT NULL. Vous pouvez résoudre ce problème en modifiant votre cascade ou en définissant le champ pour autoriser les NULLvaleurs.
  6. Assurez-vous que les options Charset et Collate sont les mêmes au niveau de la table et au niveau du champ individuel pour les colonnes clés.
  7. Vous avez une valeur par défaut (c'est-à-dire, par défaut = 0) sur votre colonne de clé étrangère
  8. L'un des champs de la relation fait partie d'une clé de combinaison (composite) et n'a pas son propre index individuel. Même si le champ a un index dans le cadre de la clé composite, vous devez créer un index distinct pour ce champ clé uniquement afin de l'utiliser dans une contrainte.
  9. Vous avez une erreur de syntaxe dans votre ALTERdéclaration ou vous avez mal saisi l'un des noms de champ de la relation
  10. Le nom de votre clé étrangère dépasse la longueur maximale de 64 caractères.

Pour plus de détails, reportez-vous à: Erreur MySQL numéro 1005 Impossible de créer la table

Peter Mortensen
la source
4
le problème était que les jeux de caractères de clé étrangère ne correspondaient pas. Merci d'avoir répondu.
lamostreta
4
SHOW ENGINE INNODB STATUScomme mentionné dans cette question m'a aidé à diagnostiquer mon problème particulier (PEBCAK, dans mon cas ...)
Hobo
1
putain, même le c'est une clé primaire. Vous devez créer un index individuel pour cette clé. merci cela a résolu mon problème.
RSB
3
# 4 était mon problème - l'une des tables était MyISAM et le script a essayé de créer une table InnoDB. J'ai rencontré ce problème lorsque j'essayais de déployer un ancien système qui exécutait initialement MySQL 5.0 ou une version similaire, où le moteur de stockage par défaut était MyISAM et les scripts fonctionnaient correctement. Mon environnement actuel est 5.5 et le stockage par défaut est InnoDB. L'ajout set names 'utf8', storage_engine=MYISAM;au début du script a résolu le problème pour moi. Merci @ user319198 et @Stefano pour la réponse élaborée! : o)
Boris Chervenkov
1
Le mien manquait l'attribut 'unsigned' comme mentionné dans # 1, merci!
helvete
11

Cela peut également se produire lors de l'exportation de votre base de données d'un serveur à un autre et les tables sont répertoriées par défaut par ordre alphabétique.
Ainsi, votre première table pourrait avoir une clé étrangère d'une autre table qui n'a pas encore été créée. Dans de tels cas, désactivez les contrôles de clé étrangère et créez la base de données.

Ajoutez simplement ce qui suit à votre script:

SET FOREIGN_KEY_CHECKS=0;

et cela fonctionnera.

happyhardik
la source
4

Très souvent, cela se produit lorsque la clé étrangère et la clé de référence n'ont pas le même type ou la même longueur.

zahid9i
la source
4

Parfois, cela est dû au fait que la table maître est supprimée (peut-être en désactivant les contrôles de clé étrangère), mais la clé étrangère CONSTRAINT existe toujours dans d'autres tables. Dans mon cas, j'avais laissé tomber la table et essayé de la recréer, mais cela me renvoyait la même erreur.

Essayez donc de supprimer toutes les contraintes de clé étrangère de toutes les tables s'il y en a, puis mettez à jour ou créez la table.

Rajug
la source
2

J'ai eu une erreur similaire. Le problème était lié au fait que les tables enfant et parent n'avaient pas le même jeu de caractères et le même classement. Cela peut être corrigé en ajoutant ENGINE = InnoDB DEFAULT CHARACTER SET = utf8;

CREATE TABLE IF NOT EXISTS `country` (`id` INT(11) NOT NULL AUTO_INCREMENT,...) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8;

... sur l'instruction SQL signifie qu'il manque du code.

user2258168
la source
2

La clé étrangère doit avoir exactement le même type que la clé primaire à laquelle elle fait référence. Pour l'exemple a le type "INT UNSIGNED NOT NULL" la clé étrangère doit également "INT UNSIGNED NOT NULL"

CREATE TABLE employees(
id_empl INT UNSIGNED NOT NULL AUTO_INCREMENT,
PRIMARY KEY(id)
);
CREATE TABLE offices(
id_office INT UNSIGNED NOT NULL AUTO_INCREMENT,
id_empl INT UNSIGNED NOT NULL,
PRIMARY KEY(id),
CONSTRAINT `constraint1` FOREIGN KEY (`id_empl`) REFERENCES `employees` (`id_empl`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='my offices';
Yaina Villafañes
la source
non signé était le problème pour moi. Merci!
Gabo
2

Code d'erreur: 1005

J'ai eu un problème similaire, alors voici quelques choses que j'ai essayées (pas dans n'importe quel ordre, à l'exception de la solution :))

  1. Changement des noms de clés étrangères (cela n'a pas fonctionné)
  2. Réduction de la longueur de la clé étrangère
  3. Vérifié les types de données (rien de mal)
  4. Vérifier les index
  5. Vérifiez les collations (tout va bien, sacrément encore)
  6. Tronqué le tableau, inutile
  7. Supprimé la table et recréé
  8. J'ai essayé de voir si une référence circulaire était créée --- tout va bien
  9. Enfin, j'ai vu que j'avais deux éditeurs ouverts. Un cela dans PhpStorm (JetBrains) et l'autre atelier MySQL. Il semble que PhpStorm / MySQL Workbench crée une sorte de verrou d'édition.

    J'ai fermé PhpStorm juste pour vérifier si le verrouillage était le cas (cela aurait pu être l'inverse). Cela a résolu mon problème.

Rajiv Nair
la source
2

J'ai eu le même message d'erreur. Enfin, j'ai compris que j'avais mal orthographié le nom de la table dans la commande:

ALTER TABLE `users` ADD FOREIGN KEY (country_id) REFERENCES country (id);

contre

ALTER TABLE `users` ADD FOREIGN KEY (country_id) REFERENCES countries (id);

Je me demande pourquoi MySQL ne peut pas dire qu'une telle table n'existe pas ...

Csongor Halmai
la source
1

MyISAM vient d'être mentionné. Essayez simplement d'ajouter ENGINE = MyISAM DEFAULT CHARSET = latin1 AUTO_INCREMENT = 2; à la fin d'une instruction, en supposant que vos autres tables ont été créées avec MyISAM.

CREATE TABLE IF NOT EXISTS `tablename` (
  `key` bigint(20) NOT NULL AUTO_INCREMENT,
  FOREIGN KEY `key` (`key`) REFERENCES `othertable`(`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;
Damir Olejar
la source
1

Dans mon cas, cela s'est produit lorsqu'une table est InnoB et l'autre MyISAM. Changer le moteur d'une table, via MySQL Workbench, résout pour moi.

rkawano
la source
1

C'est arrivé dans mon cas, car le nom de la table référencée dans la déclaration de contrainte n'était pas correct (j'ai oublié les majuscules dans le nom de la table):

ALTER TABLE `Window` ADD CONSTRAINT `Windows_ibfk_1` FOREIGN KEY (`WallId`) REFERENCES `Wall` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
Abdellah Alaoui
la source
1

vérifier que les deux tables ont le même schéma InnoDB MyISAM. Je les ai tous faits de la même manière dans mon cas InnoDB et j'ai travaillé

Brian Sanchez
la source
1

Mon problème n'était pas répertorié, c'était quelque chose de tellement idiot ..... La table qui a FKcomme PK était un composite PKqui a été déclaré comme ceci: clé primaire ( CNPJ, CEP) Je voulais que le champ CEP soit FKdans une autre table et j'étais coincé dans cette erreur, la morale de l'histoire vient d'inverser le code ci-dessus pour la clé primaire ( CEP, CNPJ) et cela a fonctionné. Obtenez un pourboire à leurs amis.

Fagner Willys
la source