我有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)
)
如何将std_id
和class_a
表中的唯一class_b
作为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)
接着是
<{1}}表上的{p>ALTER TABLE sn_number ADD FOREIGN KEY(std_id) REFERENCES class_b(std_id)
,但会互相覆盖。
我读过这些: Foreign Key Referencing Multiple Tables和
Composite key as foreign key (sql) 但我无法找到问题的解决方案。
答案 0 :(得分:1)
外键必须仅引用一个父表。这是SQL语法和关系理论的基础。
您可以做的是添加包含所有classes
的另一个表students
或std_id
,然后只引用FK
。
答案 1 :(得分:0)
由于您未在FOREIGN KEY
声明中明确指定约束名称,因此DBMS会从表名sn_number
中生成一个。您的问题是您每次都隐式声明相同的约束名称,因此名称的旧信息将丢失。只需对表和表的不同情况使用不同的显式约束名称。列表REFERENCES
表&amp;列列表。
CONSTRAINT fk_sn_number_a FOREIGN KEY(std_id) REFERENCES class_a(std_id)
CONSTRAINT fk_sn_number_b FOREIGN KEY(std_id) REFERENCES class_b(std_id)
了解Using FOREIGN KEY Constraints的基础知识。
PS正如评论中所说,这是一个糟糕的设计。但与评论相反另一个答案,你需要同一张桌子和两张外键。列列表不是设计不佳的症状。但请注意,人们通常在可疑设计中使用“外键引用多个表”时遇到的问题是,他们认为他们的表格在设计时需要从一个地方到两个地方的外键。这样的设计甚至不涉及外键,它只涉及让人联想到外键。