gpt4 book ai didi

mysql - MySQL建表时如何去掉errno 150?

转载 作者:行者123 更新时间:2023-11-30 21:26:38 25 4
gpt4 key购买 nike

所以首先,我查看了具有相同 errno 150 问题的其他帖子,答案似乎非常不同,因为 errno 150 非常模棱两可。

这是我的代码

SET FOREIGN_KEY_CHECKS = 0;
DROP TABLE IF EXISTS GAME;
DROP TABLE IF EXISTS CONSOLE;
DROP TABLE IF EXISTS DEVELOPER;
DROP TABLE IF EXISTS RATING;
SET FOREIGN_KEY_CHECKS = 1;

CREATE TABLE GAME(
Title VARCHAR(50) NOT NULL,
Console VARCHAR(50) NOT NULL,
Release_Date DATE NOT NULL,
Genre VARCHAR(50) NOT NULL,
Max_Players TINYINT NOT NULL,
Developer VARCHAR(50) NOT NULL,
Rating VARCHAR(4) NOT NULL,
PRIMARY KEY(Title, Console)
);

CREATE TABLE CONSOLE(
Company VARCHAR(50) NOT NULL,
Console VARCHAR(50) NOT NULL,
Num_Of_Controllers TINYINT NOT NULL,
PRIMARY KEY(Console),
FOREIGN KEY(Console) REFERENCES GAME(Console) ON DELETE CASCADE
);

CREATE TABLE DEVELOPER(
Developer VARCHAR(50) NOT NULL,
Region VARCHAR(50) NOT NULL,
PRIMARY KEY(Developer),
FOREIGN KEY(Developer) REFERENCES GAME(Developer) ON DELETE CASCADE
);

CREATE TABLE ESRB(
Rating VARCHAR(4) NOT NULL,
Age TINYINT NOT NULL,
PRIMARY KEY(Rating),
FOREIGN KEY(Rating) REFERENCES GAME(ESRB) ON DELETE NO ACTION
);

但是一旦运行,我得到一个错误

ERROR 1005 (HY000) at line 19: Can't create table '<database_name>.CONSOLE' (errno: 150)

其他帖子有外键检查问题,这就是我在查询开头更改外键检查标志的原因。有谁知道该怎么做吗?

我猜这是外键引用的问题,因为 GAME 表创建得很好,但我不知道如何修复它。任何帮助将不胜感激

编辑:

我也尝试在所有创建的末尾使用 ALTER TABLE 来添加外键,但我仍然得到相同的错误号 150。

最佳答案

你的代码有如下外键声明:

CREATE TABLE ESRB(
Rating VARCHAR(4) NOT NULL,
Age TINYINT NOT NULL,
PRIMARY KEY(Rating),
FOREIGN KEY(Rating) REFERENCES GAME(ESRB) ON DELETE NO ACTION
);

我怀疑你在这里混合了东西。

您希望 GAME 表具有指向其他表的外键,而不是相反。

因此,您应该将外键声明从表CONSOLEDEVELOPERESRB 移动到GAME表,如下:

CREATE TABLE GAME(
Title VARCHAR(50) NOT NULL,
Console VARCHAR(50) NOT NULL,
Release_Date DATE NOT NULL,
Genre VARCHAR(50) NOT NULL,
Max_Players TINYINT NOT NULL,
Developer VARCHAR(50) NOT NULL,
Rating VARCHAR(4) NOT NULL,
PRIMARY KEY(Title, Console),
FOREIGN KEY(Console) REFERENCES CONSOLE(Console) ON DELETE CASCADE,
FOREIGN KEY(Developer) REFERENCES DEVELOPER(Developer) ON DELETE CASCADE,
FOREIGN KEY(Rating) REFERENCES ESRB(Rating) ON DELETE NO ACTION
);

这为您提供了一个设置,其中 ConsoleDeveloperRating 列中的值必须属于各自的引用表。我相信就是您想要的。

此外,由于该表现在引用了其他 3 个表,因此它应该最后创建,而不是最先创建。

Demo on DB Fiddle

关于mysql - MySQL建表时如何去掉errno 150?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58630027/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com