错误代码: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链接的字段必须完全匹配定义。
一些已知的原因可能是:
- 两个关键字段types和/或大小不完全匹配。 例如,如果一个是
INT(10)
则关键字段也需要为INT(10)
,而不是INT(11)
或TINYINT
。 您可能需要使用SHOW
CREATE
TABLE
来确认字段大小,因为查询浏览器有时在视觉上只显示INT(10)
和INT(11)
INTEGER
。 你也应该检查一个没有SIGNED
,另一个是UNSIGNED
。 他们都需要完全一样。 - 您试图引用的关键字段之一没有索引和/或不是主键。 如果关系中的某个字段不是主键,则必须为该字段创build一个索引。
- 外键名称是已有键的副本。 检查您的外键的名称在数据库中是唯一的。 只需在您的密钥名称的末尾添加几个随机字符即可testing。
- 一个或两个表是
MyISAM
表。 为了使用外键,表必须都是InnoDB
。 (实际上,如果两个表都是MyISAM
那么你不会得到一个错误消息 – 它只是不会创build密钥。)在查询浏览器中,您可以指定表types。 - 您已经指定级联
ON
DELETE
SET
NULL
,但是相关的键字段被设置为NOT
NULL
。 您可以通过更改级联或将字段设置为允许NULL
值来解决此问题。 - 确保Charset和Collate选项在表级别以及关键列的单个字段级别都相同。
- 您的外键列上有一个默认值(即默认值= 0)
- 关系中的一个字段是组合(复合)键的一部分,并没有它自己的单独索引。 即使该字段有一个索引作为组合键的一部分,但您必须为该键字段创build一个单独的索引才能在约束中使用该索引。
- 你在你的
ALTER
语句中有一个语法错误,或者你在关系中input了一个字段名称 - 您的外键的名称超过了64个字符的最大长度。
有关更多详细信息,请参阅: MySQL错误号1005无法创build表
在将数据库从一台服务器导出到另一台服务器时,也可能会发生这种情况,并且默认情况下这些表按字母顺序排列。
所以,你的第一个表可能有一个尚未创build的另一个表的外键。 在这种情况下,请禁用foreign_key_checks并创build数据库。
只需将以下内容添加到您的脚本中:
SET FOREIGN_KEY_CHECKS=0;
它将工作。
当外键和引用键不具有相同的types或相同的长度时,通常会发生这种情况
我知道这是一个迟到的答案,但我认为这可能有助于某人。
有时是由于主表被丢弃(可能是通过禁用foreign_key_checks),但外键CONSTRAINT仍然存在于其他表中。 在我的情况下,我已经放弃了桌子,并试图重新创build它,但它为我扔了同样的错误。
因此,如果有的话,尝试删除所有表中的所有外键CONSTRAINT,然后更新或创build表。
错误代码:1005
你好,我正在穿越这个答案,以便像我这样的类似问题的任何人都可以受益于这个回应。 相信我,这可以被忽略)(这可能已经被回答,如果是这样,请原谅我)
我有类似的问题,所以这里有几件事,我曾尝试(除了解决scheme:)以外的任何顺序)
- 更改了外键名称(没有工作)
- 缩短了外键长度
- validation数据types(不要误解)
- 检查索引
- 检查整理(一切正常,再次补损)
- 把桌子截断,没用好
- 丢下桌子,重新创build
- 试图看看是否有任何循环引用正在创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';