【问题标题】:MYSQL - Cannot add foreign key constraint, but why?MYSQL - 无法添加外键约束,但为什么呢?
【发布时间】:2021-02-19 12:13:46
【问题描述】:

我不明白我在尝试运行此代码时无法添加外键约束。我把它缩小到最后一行:

外键 (room_no) REFERENCES Classroom(room_no)

给我这个错误,因为当我删除它时,代码运行正常。有人可以向我解释这个问题吗?这段代码是更大代码块的一部分,后来我似乎遇到了同样的问题。 谢谢!

CREATE TABLE Classroom (
    building VARCHAR(100),
    room_no SMALLINT UNSIGNED,
    capacity SMALLINT UNSIGNED,
    CONSTRAINT PK_Prereq PRIMARY KEY (building, room_no)
);

CREATE TABLE Section (
    course_id INT UNSIGNED,
    sec_id INT UNSIGNED,
    semester SMALLINT UNSIGNED,
    year SMALLINT UNSIGNED,
    building VARCHAR(100),
    room_no SMALLINT UNSIGNED,
    time_slot_id INT UNSIGNED,
    CONSTRAINT PK_Prereq PRIMARY KEY (course_id, sec_id, semester, year),
    FOREIGN KEY (building) REFERENCES Classroom(building),
    FOREIGN KEY (room_no) REFERENCES Classroom(room_no)
); 

【问题讨论】:

    标签: mysql sql foreign-keys constraints create-table


    【解决方案1】:

    您只需要一个外键而不是两个外键,它引用作为父表中主键的列集。

    所以改变这个:

    FOREIGN KEY (building) REFERENCES Classroom(building),
    FOREIGN KEY (room_no) REFERENCES Classroom(room_no)
    

    收件人:

    FOREIGN KEY (building, roo_no) REFERENCES Classroom(building, roo_no)
    

    需要注意的是:

    • 列的数据类型(以及长度或精度)必须相同

    • 外键中的列必须以与主键中相同的顺序出现

    不相关:yeara language keyword in MySQL,因此不是一个好的列名选择。

    【讨论】:

    • 只是 pedantic 注意:数据类型不需要相同,但至少非常相似。接受不同的数值精度。例如,BIGINT 可以指向INT,反之亦然。在我的 orm 中导航不同的 fks 时遇到很多问题。
    猜你喜欢
    • 1970-01-01
    • 2013-03-10
    • 2021-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多