引用多个唯一键的外键

时间:2016-07-10 13:03:02

标签: mysql database foreign-keys unique-key

我有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_idclass_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) 但我无法找到问题的解决方案。

2 个答案:

答案 0 :(得分:1)

  

外键必须仅引用一个父表。这是SQL语法和关系理论的基础。

您可以做的是添加包含所有classes的另一个表studentsstd_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正如评论中所说,这是一个糟糕的设计。但与评论相反另一个答案,你需要同一张桌子和两张外键。列列表不是设计不佳的症状。但请注意,人们通常在可疑设计中使用“外键引用多个表”时遇到的问题是,他们认为他们的表格在设计时需要从一个地方到两个地方的外键。这样的设计甚至不涉及外键,它只涉及让人联想到外键。