mySQL关于foreign key的若干问题

首先,表之间的关系如下:
系名(系号,系名)系号mno是主码
学生(学号,学生姓名,学生性别,出生日期,系号)学号sno是主码,系号mno是外码
课程(课程号,课程名,学分)课程号cno是主码
成绩(学生号,课程号,成绩)其中学号sno和课程号cno为外码,联合为主码
教师(教工号,教师姓名,教师性别,系号)教工号tno是主码,系号mno是外码

然后我在编辑成绩表外码的时候,遇到了一个问题是:
外码sno没有办法reference到学生表的sno列,不知道为什么一直要我reference到sname列(然而cno没有这个问题)如果我硬要点sno列的话,具体见图:

img

img


不知道哪里错了TT

另外一个问题是:但我在编辑教师表的时候,外码mno一直放不进去,显示错误,然后我好奇为什么我做学生表的时候可以放外码mno,而且成功了,所以我就把学生表的mno外码删了,发现就可以在教师表里放外码mno了
不知道为什么不能同时把mno作为两个不同的表的外码

【以下回答由 GPT 生成】

首先,关于第一个问题,外码sno无法引用到学生表的sno列的原因是因为类型不一致。sno在学生表中是主键,而在成绩表中是外键,它们的数据类型要一致才能进行引用关系。你可以检查一下两个表中sno列的数据类型是否一致,如果不一致,需要进行调整。另外,如果你想引用学生表的sno列,可以在创建成绩表时指定FOREIGN KEY(学生号)REFERENCES 学生(学号)。

示例代码:

CREATE TABLE 成绩 (
    学生号 INT,
    课程号 INT,
    成绩 INT,
    FOREIGN KEY (学生号) REFERENCES 学生(学号),
    FOREIGN KEY (课程号) REFERENCES 课程(课程号)
);

关于第二个问题,你无法同时将mno作为两个不同表的外码的原因是因为外键必须唯一地引用到一个主键上。如果你想在教师表和学生表中都引用系号mno,可以将mno作为一个独立的主键表存在。

示例代码:

CREATE TABLE  (
    系号 INT PRIMARY KEY,
    系名 VARCHAR(100)
);

CREATE TABLE 学生 (
    学号 INT PRIMARY KEY,
    学生姓名 VARCHAR(100),
    学生性别 VARCHAR(10),
    出生日期 DATE,
    系号 INT,
    FOREIGN KEY (系号) REFERENCES (系号)
);

CREATE TABLE 教师 (
    教工号 INT PRIMARY KEY,
    教师姓名 VARCHAR(100),
    教师性别 VARCHAR(10),
    系号 INT,
    FOREIGN KEY (系号) REFERENCES (系号)
);

这样,你就可以在学生表和教师表中同时引用系号mno了。

希望以上解决方案对你有帮助。如果你还有其他问题,请随时提问。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^