首页 > 解决方案 > 在 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。

标签: mysql

解决方案


您的代码具有外键声明,例如:

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,如下所示:ESRBGAME

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 个表,因此应该最后创建它,而不是第一个。

DB Fiddle 上的演示


推荐阅读