外键错误 - 错误 1005 (HY000) ... 无法创建表 ... `stored_on` (errno: 150)

Posted

技术标签:

【中文标题】外键错误 - 错误 1005 (HY000) ... 无法创建表 ... `stored_on` (errno: 150)【英文标题】:Foreign Key Error - ERROR 1005 (HY000) ... Can't create table ... `stored_on` (errno: 150) 【发布时间】:2020-08-07 14:11:38 【问题描述】:

我在 mariadb 中创建了两个表。 stored_on 关系将书架和书籍联系在一起。一切正常,除了我将 lib_floor 添加到存储的关系中,这个错误突然出现了。当我从存储在主键上的 lib_floor、lib_floor 的外键定义和 lib_floor 中删除时,没有问题。有任何想法吗?数据类型相同(INT)。

CREATE TABLE shelf (
    shelf_number        INT            NOT NULL,
    lib_name            VARCHAR(50)    NOT NULL,
    lib_floor           INT            NOT NULL,
    FOREIGN KEY (lib_name) REFERENCES library (lib_name) ON DELETE CASCADE,
    PRIMARY KEY (shelf_number,lib_name,lib_floor)
);  

CREATE TABLE stored_on (    
    shelf_number      INT            NOT NULL,
    lib_name          VARCHAR(50)    NOT NULL,
    lib_floor         INT            NOT NULL,
    isbn              VARCHAR(20)    NOT NULL,
    total_copies      INT            NOT NULL,
    FOREIGN KEY (shelf_number) REFERENCES shelf (shelf_number) ON DELETE CASCADE,
    FOREIGN KEY (lib_name) REFERENCES shelf (lib_name) ON DELETE CASCADE,
    FOREIGN KEY (lib_floor) REFERENCES shelf (lib_floor) ON DELETE CASCADE,
    FOREIGN KEY (isbn)  REFERENCES book (isbn) ON DELETE CASCADE,
    PRIMARY KEY (shelf_number,lib_name,lib_floor,isbn)
);

警告 1:

|警告 | 150 |创建表 ... .stored_on 与 外键约束失败。引用中没有索引 引用的列显示为附近的第一列的表 '外键 (lib_floor) 参考书架 (lib_floor) ON DELETE 级联, FOREIGN KEY (isbn) 参考书 (isbn) ON DELETE CASCADE, 主键 (shelf_number,lib_name,lib_floor,isbn) )'。 |

错误 1:

|错误 | 1005 |无法创建表 ...stored_on (errno: 150 "外键约束格式不正确")

警告 2:

警告 | 1215 |无法添加外键约束 stored_on

【问题讨论】:

【参考方案1】:

错误消息是不言自明的,shelf 需要有一个INDEX,其中lib_floor 是提到的第一个字段。你可以简单地添加一个INDEX(它不需要是UNIQUE):

CREATE TABLE shelf (
    shelf_number        INT            NOT NULL,
    lib_name            VARCHAR(50)    NOT NULL,
    lib_floor           INT            NOT NULL,
    FOREIGN KEY (lib_name) REFERENCES library (lib_name) ON DELETE CASCADE,
    PRIMARY KEY (shelf_number,lib_name,lib_floor),
    INDEX (lib_floor)
); 

请注意,您也会从lib_name 收到此错误,但shelflib_nameFOREIGN KEY 声明会自动在其上创建索引。

Demo on dbfiddle

【讨论】:

天哪!太感谢了。我在一个数据库类中,我们根本不需要索引。我会仔细阅读并弄清楚它的目的。【参考方案2】:

外键很棘手。 err 150(和其他)有几种解决方法

禁用 FK、CREATE TABLE、重新启用 FK

在执行相关的 CREATE TABLEs 后通过 ALTER 应用 FK

(其他人?)

【讨论】:

以上是关于外键错误 - 错误 1005 (HY000) ... 无法创建表 ... `stored_on` (errno: 150)的主要内容,如果未能解决你的问题,请参考以下文章

SQLSTATE [HY000]:一般错误:1005无法创建表`Projectname`.`users`(errno:150“外键约束格式不正确”)[重复]

SQLSTATE [HY000]:一般错误:1005 无法创建表 `ic`.`livros`(errno: 150 "外键约束格式不正确") id`))

SQLSTATE [HY000] Laravel 8 中的外键约束格式错误

Mysql错误问题:ERROR 1005 (HY000): Can't create table 'crm_1.tbl_client' (errno: 150)

MySQL创建表:错误1005 errno:150“外键约束形成错误”

ERROR 1005 (HY000): 使用外键时无法创建表