错误代码:1005。无法创建表'...'(错误号:150)

我在Internet上搜索了这个问题的解决方案,并检查了Stack Overflow问题,但没有一个解决方案适合我的情况。


我想从表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);

我在两个表(charset和collation)上检查了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


慕斯王
浏览 787回答 3
3回答

子衿沉夜

错误代码:1005 - 代码中的主键引用错误通常是由于引用的外键字段不存在。可能是你有一个拼写错误,或者检查它应该是相同的,或者是字段类型不匹配。外键链接字段必须与定义完全匹配。一些已知的原因可能是:两个关键字段类型和/或大小不完全匹配。例如,如果一个是INT(10)关键字段需要INT(10)也是,而不是INT(11)或TINYINT。您可能需要确认字段大小,SHOW CREATE TABLE因为查询浏览器有时会直观地显示INTEGER两者INT(10)和INT(11)。你还应该检查一个不是SIGNED,另一个是UNSIGNED。它们都需要完全相同。您尝试引用的关键字段之一没有索引和/或不是主键。如果关系中的某个字段不是主键,则必须为该字段创建索引。外键名称是已存在键的副本。检查外键的名称在数据库中是否唯一。只需在密钥名称的末尾添加一些随机字符即可对其进行测试。您的一个或两个表是一个MyISAM表。为了使用外键,表必须都是InnoDB。(实际上,如果两个表都是,MyISAM那么您将不会收到错误消息 - 它只是不会创建密钥。)在查询浏览器中,您可以指定表类型。您已指定级联ON DELETE SET NULL,但相关键字段设置为NOT NULL。您可以通过更改级联或将字段设置为允许NULL值来解决此问题。确保Charset和Collate选项在表级别以及关键列的单个字段级别都相同。外键列上有一个默认值(即默认值= 0)关系中的一个字段是组合(复合)键的一部分,并且没有自己的单独索引。即使该字段具有索引作为复合键的一部分,您也必须仅为该键字段创建单独的索引,以便在约束中使用它。您的ALTER语句中存在语法错误,或者您在关系中输入了一个字段名称外键的名称超过64个字符的最大长度。

弑天下

将数据库从一个服务器导出到另一个服务器时,也可能发生这种情况,默认情况下,这些表按字母顺序列出。因此,您的第一个表可能具有另一个尚未创建的表的外键。在这种情况下,请禁用foreign_key_checks并创建数据库。只需将以下内容添加到脚本中:SET FOREIGN_KEY_CHECKS=0;它应该工作。

阿晨1998

有时它是由于主表被删除(可能是通过禁用foreign_key_checks),但外键CONSTRAINT仍然存在于其他表中。在我的情况下,我放弃了桌子并尝试重新创建它,但它给我带来了同样的错误。因此,尝试从所有表中删除所有外键CONSTRAINT(如果有),然后更新或创建表。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

MySQL