我在 Internet 上搜索了此问题的解决方案并查看了 StackOverflow 问题,但没有一个解决方案适用于我的案例。
我想创建一个从表 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 -- 代码中的主键引用错误
通常是由于引用的外键字段不存在。可能是您有拼写错误,或者检查大小写应该相同,或者字段类型不匹配。外键链接的字段必须与定义完全匹配。
一些已知的原因可能是:
- 两个关键字段类型和/或大小不完全匹配。例如,如果一个是
INT(10)
,则关键字段也需要是INT
而不是BIGINT
或SMALLINT
或TINYINT
。您还应该检查一个不是SIGNED
而另一个是UNSIGNED
。它们都需要完全相同。 - 您尝试引用的关键字段之一没有索引和/或不是主键。如果关系中的某个字段不是主键,则必须为该字段创建索引。
- 外键名称是现有键的副本。检查您的外键名称在您的数据库中是唯一的。只需在 key 名称的末尾添加几个随机字符即可进行测试。
- 您的一个或两个表是
MyISAM
表。为了使用外键,表必须都是InnoDB
。 (实际上,如果两个表都是MyISAM
那么您不会收到错误消息 - 它只是不会创建键。)在查询浏览器中,您可以指定表类型。 - 你已经指定了级联
ON
DELETE
SET
NULL
,但是相关键域设置为不
NULL
。您可以通过更改级联或将字段设置为允许NULL
值来解决此问题。 - 确保 Charset 和 Collate 选项在表级别以及键列的单个字段级别都相同。
- 您的外键列有一个默认值(即 default=0)
- 关系中的一个字段是组合(复合)键的一部分,并且没有自己的单独索引。即使该字段有一个索引作为复合键的一部分,您也必须仅为该键字段创建一个单独的索引才能在约束中使用它。
- 您的
ALTER
语句中有语法错误,或者您在关系中输入了错误的字段名称之一 - 您的外键名称超过了 64 个字符的最大长度。
关于mysql - 错误代码 : 1005. 无法创建表 '...' (errno: 150),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9018584/