错误代码:1005.无法创build表'…'(errno:150)

我在网上search了这个问题的解决scheme,并检查了SO问题,但没有解决scheme为我的案件工作。

我想创build一个从表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 ; 

这个脚本返回:

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

我试着给被引用的表添加索引:

 CREATE INDEX METAL_KODU_INDEX ON metal_kod (METAL_KODU); 

我检查了两个表上的METAL_KODU(字符集和整理)。 但是找不到解决这个问题的办法。 有没有人有任何想法? 提前致谢。

编辑:这是metal_kod表:

 METAL_KODU varchar(4) NO PRI DURUM bit(1) NO METAL_ISMI varchar(30) NO AYAR_YOGUNLUK smallint(6) YES 100 

错误代码:1005 – 代码中存在错误的主键引用

通常这是由于参考FK字段不存在。 可能是你有错字,或者检查大小写应该是一样的,还是有字段types不匹配。 FK链接的字段必须完全匹配定义。

一些已知的原因可能是:

  1. 两个关键字段types和/或大小不完全匹配。 例如,如果一个是INT(10)则关键字段也需要为INT(10) ,而不是INT(11)TINYINT 。 您可能需要使用SHOW CREATE TABLE来确认字段大小,因为查询浏览器有时在视觉上只显示INT(10)INT(11) INTEGER 。 你也应该检查一个没有SIGNED ,另一个是UNSIGNED 。 他们都需要完全一样。
  2. 您试图引用的关键字段之一没有索引和/或不是主键。 如果关系中的某个字段不是主键,则必须为该字段创build一个索引。
  3. 外键名称是已有键的副本。 检查您的外键的名称在数据库中是唯一的。 只需在您的密钥名称的末尾添加几个随机字符即可testing。
  4. 一个或两个表是MyISAM表。 为了使用外键,表必须都是InnoDB 。 (实际上,如果两个表都是MyISAM那么你不会得到一个错误消息 – 它只是不会创build密钥。)在查询浏览器中,您可以指定表types。
  5. 您已经指定级联ON DELETE SET NULL ,但是相关的键字段被设置为NOT NULL 。 您可以通过更改级联或将字段设置为允许NULL值来解决此问题。
  6. 确保Charset和Collat​​e选项在表级别以及关键列的单个字段级别都相同。
  7. 您的外键列上有一个默认值(即默认值= 0)
  8. 关系中的一个字段是组合(复合)键的一部分,并没有它自己的单独索引。 即使该字段有一个索引作为组合键的一部分,但您必须为该键字段创build一个单独的索引才能在约束中使用该索引。
  9. 你在你的ALTER语句中有一个语法错误,或者你在关系中input了一个字段名称
  10. 您的外键的名称超过了64个字符的最大长度。

有关更多详细信息,请参阅: MySQL错误号1005无法创build表

在将数据库从一台服务器导出到另一台服务器时,也可能会发生这种情况,并且默认情况下这些表按字母顺序排列。
所以,你的第一个表可能有一个尚未创build的另一个表的外键。 在这种情况下,请禁用foreign_key_checks并创build数据库。

只需将以下内容添加到您的脚本中:

 SET FOREIGN_KEY_CHECKS=0; 

它将工作。

当外键和引用键不具有相同的types或相同的长度时,通常会发生这种情况

我知道这是一个迟到的答案,但我认为这可能有助于某人。

有时是由于主表被丢弃(可能是通过禁用foreign_key_checks),但外键CONSTRAINT仍然存在于其他表中。 在我的情况下,我已经放弃了桌子,并试图重新创build它,但它为我扔了同样的错误。

因此,如果有的话,尝试删除所有表中的所有外键CONSTRAINT,然后更新或创build表。

错误代码:1005

你好,我正在穿越这个答案,以便像我这样的类似问题的任何人都可以受益于这个回应。 相信我,这可以被忽略)(这可能已经被回答,如果是这样,请原谅我)

我有类似的问题,所以这里有几件事,我曾尝试(除了解决scheme:)以外的任何顺序)

  1. 更改了外键名称(没有工作)
  2. 缩短了外键长度
  3. validation数据types(不要误解)
  4. 检查索引
  5. 检查整理(一切正常,再次补损)
  6. 把桌子截断,没用好
  7. 丢下桌子,重新创build
  8. 试图看看是否有任何循环引用正在创build – 一切正常

9.最后,我看到有两位编辑打开了。 一个在PHPStorm(jetbrains)和另一个MySQL工作台。 似乎PHPStorm / SQL工作台创build某种编辑锁。 我closuresPHPStorm只是为了检查是否locking(可能是相反的情况)。 这解决了我的问题。 希望这可以帮助有类似问题的人。

我有一个类似的错误。 问题必须与子表和父表没有相同的字符集和整理。 这可以通过追加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; 

…在SQL语句上意味着有一些缺less的代码。

这发生在我的情况,因为在约束声明中引用表的名称是不正确的(我忘记了表名中的大写)

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

我希望有帮助。

刚刚提到MyISAM。 只需尝试添加ENGINE = MyISAM DEFAULT CHARSET = latin1 AUTO_INCREMENT = 2; 在声明的最后,假设你的其他表是用MyISAM创build的。

 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 ; 

在我的情况下,当一个表是InnoB而另一个表是MyISAM时。 通过MySQL Workbench更改一个表的引擎,为我解决。

我有相同的错误信息。 最后我发现我在命令中拼错了表名:

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

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

我想知道为什么地球上mysql不能告诉这样一个表不存在… … –

外键必须具有与其引用的主键完全相同的types。 例如,“INT UNSIGNED NOT NULL”types的foreach键也必须“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';