【发布时间】:2016-07-10 13:03:01
【问题描述】:
我有 3 张桌子:
class_a
CREATE TABLE class_a (
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
std_id INT NOT NULL UNIQUE,
name varchar(225) NOT NULL)
class_b
CREATE TABLE class_b (
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
std_id INT NOT NULL UNIQUE,
name varchar(225) NOT NULL)
sn_number
CREATE TABLE sn_number (
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
pin INT NOT NULL UNIQUE,
serial VARCHAR(255) NOT NULL UNIQUE,
std_id INT NULL DEFAULT NULL,
FOREIGN KEY(std_id) REFERENCES class_a(std_id)
)
如何将class_a 和class_b 表中唯一的std_id 引用为sn_number 表中的外键。
我想实现类似ALTER TABLE sn_number ADD FOREIGN KEY(std_id) REFERENCES class_a(std_id), class_b(std_id)
我试过这样做ALTER TABLE sn_number ADD FOREIGN KEY(std_id) REFERENCES class_a(std_id)
紧随其后
ALTER TABLE sn_number ADD FOREIGN KEY(std_id) REFERENCES class_b(std_id) 在sn_number 表上,但会继续相互覆盖。
我已阅读以下内容: Foreign Key Referencing Multiple Tables 和
Composite key as foreign key (sql) 但我找不到解决问题的方法。
【问题讨论】:
-
出现此问题是在暗示您在数据库设计中存在错误。班级不是学生。因此,您通常不会通过类表引用 std_id,而是通过学生表。你应该考虑一下为什么你有两个类表,因为当你想连接时你可能会遇到同样的问题,例如老师或房间上课。基本上:存在类。有学生。存在 sn_numbers。每个人都有一张桌子,并将它们链接起来(如果你愿意,你可以直接绘制它们并用线条连接它们)。如果您需要专业化,您可以稍后添加。
-
谢谢。这对我帮助很大。
-
@Abk 与@Solarflare 的评论和另一个答案相反,您需要来自同一个表和列列表的两个外键并不是设计不佳的症状。 (虽然你的设计很糟糕。)关于你的代码的问题,请参阅我的答案。
-
@Abk 既然我回来了:作为修正:我没有问sn_numbers的含义。如果它们是学生独有的,您可以使用学生表并将 pin/sn_number 添加到该表(它基本上是两个实体的合并,具有 1:1 的关系)。但是由于您在 sn_number 中的 std_id 可以为空,我想也可能有 sn_numbers 出于其他原因(可能是未分配的身份证)。反之亦然,您可以从类中引用 sn_numbers 中的 std_id 列(将 sn_numbers 表视为 student_id 表)。这样做只是有实际原因(表数),没有逻辑。
-
您希望 sn_number 中的非 NULL std_id 值在 both class_a 和 class_b 中吗? (请参阅我的答案。)或者 either (异或或包含-或)? (请参阅我对“reminiscent 的回答。)或者您是否希望 class_a 和 class_b 中的 std_id 值都在 sn_number 中??(这意味着您希望 class_a
FK (std_id) REFERENCES sn_number (std_id)和 class_bFK (std_id) REFERENCES sn_number (std_id)带有 sn_number std_idNOT NULL.) PS 请显示您的 DDL 和相应的错误消息。
标签: mysql database foreign-keys unique-key