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
mysql
foreign-keys
mysql-error-1005
Lamostreta
la source
la source
metal_kod
table ... quel champ de cette table doit faire référence à la clé étrangère?Réponses:
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:
INT(10)
le champ clé doit l'êtreINT(10)
aussi et nonINT(11)
ouTINYINT
. Vous souhaiterez peut-être confirmer la taille du champ en utilisant,SHOW
CREATE
TABLE
car le navigateur de requêtes s'affiche parfois uniquementINTEGER
pour les deuxINT(10)
etINT(11)
. Vous devez également vérifier que l'un ne l'est pasSIGNED
et que l'autre l'estUNSIGNED
. Ils doivent tous deux être exactement les mêmes.MyISAM
table. Pour utiliser des clés étrangères, les tables doivent être toutes les deuxInnoDB
. (En fait, si les deux tables le sont,MyISAM
vous 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.ON
DELETE
SET
NULL
, mais le champ clé correspondant est défini surNOT
NULL
. Vous pouvez résoudre ce problème en modifiant votre cascade ou en définissant le champ pour autoriser lesNULL
valeurs.ALTER
déclaration ou vous avez mal saisi l'un des noms de champ de la relationPour plus de détails, reportez-vous à: Erreur MySQL numéro 1005 Impossible de créer la table
la source
SHOW ENGINE INNODB STATUS
comme mentionné dans cette question m'a aidé à diagnostiquer mon problème particulier (PEBCAK, dans mon cas ...)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)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:
et cela fonctionnera.
la source
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.
la source
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.
la source
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;
... sur l'instruction SQL signifie qu'il manque du code.
la source
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"
la source
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 :))
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.
la source
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:
contre
Je me demande pourquoi MySQL ne peut pas dire qu'une telle table n'existe pas ...
la source
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.
la source
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.
la source
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):
la source
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é
la source
Mon problème n'était pas répertorié, c'était quelque chose de tellement idiot ..... La table qui a
FK
comme PK était un compositePK
qui a été déclaré comme ceci: clé primaire (CNPJ
,CEP
) Je voulais que le champ CEP soitFK
dans 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.la source