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
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:
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 SHOW
CREATE
TABLE
, 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.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.ON
DELETE
SET
NULL
, mais le champ de clé approprié 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 valeurs NULL
.ALTER
ou vous avez mal entré un des noms de champs dans la relationPour plus de détails, consultez: Numéro d'erreur MySQL 1005 Impossible de créer un tablea
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.
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.
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.
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.
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 :))
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.
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;
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';
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 ...
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.
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 ;