mysql - 在 MySQL 中创建表时如何摆脱 errno 150?
问题描述
因此,首先,我查看了具有相同 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 来添加外键,但我仍然得到相同的 errno 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
表具有指向其他表的外键,而不是相反。
因此,您应该将外键的声明从表CONSOLE
中移到表中DEVELOPER
,如下所示:ESRB
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
);
这为您提供了一个设置,其中列中的值Console
必须Developer
属于Rating
相应的参考表。我相信这就是你想要的。
此外,由于该表现在引用了其他 3 个表,因此应该最后创建它,而不是第一个。
推荐阅读
- python - Scrapy - 动态创建字段的正确选择器
- jakarta-ee - 如何在每种测试方法后重置/删除 Quarkus 中的 H2 数据库以使其独立?
- python - 基于多数组(熊猫)的数据框创建新数据
- android - 使用 Room 和 LiveData 执行新的 get 方法后如何刷新 UI?
- c - 如何“破解”缓冲区溢出攻击
- pandas - Pandas - 最后N个元素的滚动总和有条件
- python - 为什么我的 CleanScreen 功能不起作用?
- html - 如何使用 Knitr 块选项删除 R Markdown HTML 输出周围的边框
- r - 太多滚动条闪亮的rhandsontable
- vue.js - 如何根据 vue-router 中的查询参数更新我的数据