web-dev-qa-db-fra.com

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

J'ai cherché une solution à ce problème sur Internet et vérifié les questions de débordement de pile, 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 retourne:

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 (jeu de caractères et classement), 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
99
lamostreta

Code d'erreur: 1005 - votre code contient une référence de clé primaire incorrecte

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 que le cas de figure soit identique, ou que le type de champ ne corresponde pas. 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, s'il s'agit de INT(10), le champ de clé doit également être INT(10) et non INT(11) ou TINYINT. Vous voudrez peut-être confirmer la taille du champ à l'aide de SHOWCREATETABLE, car le navigateur de requêtes affichera parfois uniquement INTEGER visuellement pour INT(10) et INT(11) . Vous devriez également vérifier que l'un n'est pas SIGNED et l'autre UNSIGNED. Ils doivent tous les 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 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.
  4. Une de vos tables ou les deux est une table MyISAM. Pour utiliser des clés étrangères, les tables doivent toutes les deux être InnoDB. (En fait, si les deux tables sont MyISAM, vous ne recevrez pas de message d'erreur. La clé ne sera pas créée.) Dans le navigateur de requêtes, vous pouvez spécifier le type de table.
  5. Vous avez spécifié une cascade ONDELETESETNULL, mais le champ de clé approprié est défini sur NOTNULL. Vous pouvez résoudre ce problème en modifiant votre cascade ou en définissant le champ pour autoriser les valeurs NULL.
  6. Assurez-vous que les options Jeu de caractères et Assembler sont identiques au niveau de la table et des champs individuels pour les colonnes clés.
  7. Vous avez une valeur par défaut (c'est-à-dire, default = 0) dans votre colonne de clé étrangère
  8. L'un des champs de la relation fait partie d'une clé de combinaison (composite) et ne possède pas son propre index. Même si le champ comporte un index dans la clé composite, vous devez créer un index distinct pour ce champ de clé uniquement afin de l'utiliser dans une contrainte.
  9. Vous avez une erreur de syntaxe dans votre instruction ALTER ou vous avez mal entré un des noms de champs dans la relation
  10. Le nom de votre clé étrangère dépasse la longueur maximale de 64 caractères.

Pour plus de détails, consultez: Numéro d'erreur MySQL 1005 Impossible de créer un tablea

261
user319198

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 ordre alphabétique par défaut.
Ainsi, votre première table pourrait avoir une clé étrangère d’une autre table qui n’a pas encore été créée. Dans ce cas, désactivez foreign_key_checks et créez la base de données.

Ajoutez simplement ce qui suit à votre script:

SET FOREIGN_KEY_CHECKS=0;

et cela fonctionnera.

11
happyhardik

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

Essayez donc de supprimer toutes les CONSTRAINTs de clé étrangère de toutes les tables, le cas échéant, puis mettez à jour ou créez la table.

4
rajug

Cela arrive très souvent lorsque la clé étrangère et la clé de référence n'ont pas le même type ni la même longueur.

3
zahid9i

J'ai eu une erreur similaire. Le problème tenait au fait que la table enfant et la table 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.

2
user2258168

Code d'erreur: 1005

J'avais un problème similaire, alors voici quelques choses que j'ai essayées (sans ordre, sauf pour 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 à redire)
  4. Vérifier les index
  5. Vérifiez les collations (tout va bien, sacrément encore)
  6. Tronqué la table, d'aucune utilité
  7. Dépouillé la table et recréé
  8. J'ai essayé de voir si une référence circulaire était en train d'être créée --- tout va bien
  9. Enfin, j'ai vu que deux éditeurs étaient ouverts. L'un dans PhpStorm (JetBrains) et l'autre dans 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.

2
Rajiv Nair

C'est arrivé dans mon cas, parce que le nom de la table référencée dans la déclaration de contrainte n'était pas correct (j'ai oublié la majuscule 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;
1
Abdellah Alaoui

La clé étrangère doit avoir exactement le même type que la clé primaire à laquelle elle fait référence. Par exemple, si le type est "INT UNSIGNED NOT NULL", les touches étrangères doivent également indiquer "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';
1
Yaina Villafañes

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);

versus

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

1
Csongor Halmai

Dans mon cas, cela s'est produit lorsqu'une table est InnodB et l'autre est MyISAM. Changer le moteur d'une table, via MySQL Workbench, résout mon problème.

0
rkawano

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 ;
0
Damir Olejar