引用多个唯一键的外键
A Foreign key referencing multiple unique key
我有 3 个 table:
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
table 中引用唯一 std_id
作为 sn_number
table 中的外键。
我想达到 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
table 但会继续互相覆盖。
我读过这些:
Foreign Key Referencing Multiple Tables 和
Composite key as foreign key (sql)
但是我找不到解决问题的方法。
Foreign key must reference only one parent table. This is fundamental to both SQL syntax, and relational theory.
你可以做的是添加另一个包含所有 std_id
的 table classes
或 students
,然后只需引用 FK
即可。
由于您没有在 FOREIGN KEY
声明中明确给出约束名称,因此 DBMS 会根据 table 名称 sn_number
组成一个约束名称。您的问题是您因此每次都隐式声明相同的约束名称,因此名称的旧信息丢失了。只需对 table & column list REFERENCES
table & column list.
的不同情况使用不同的显式约束名称
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 正如评论中所说,这是一个糟糕的设计。但与评论和另一个答案相反,您需要来自同一个 table 和列列表的两个外键并不是设计不佳的症状。但是请注意,人们通常在有问题的设计中遇到 "Foreign Key Referencing Multiple Tables" 的问题是,他们认为他们的 table 按照设计需要从一个地方到两个地方的外键,而实际上他们不需要。这样的设计甚至不涉及外键,它只是涉及一些让人联想到外键的东西。
我有 3 个 table:
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
table 中引用唯一 std_id
作为 sn_number
table 中的外键。
我想达到 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
table 但会继续互相覆盖。
我读过这些: Foreign Key Referencing Multiple Tables 和
Composite key as foreign key (sql) 但是我找不到解决问题的方法。
Foreign key must reference only one parent table. This is fundamental to both SQL syntax, and relational theory.
你可以做的是添加另一个包含所有 std_id
的 table classes
或 students
,然后只需引用 FK
即可。
由于您没有在 FOREIGN KEY
声明中明确给出约束名称,因此 DBMS 会根据 table 名称 sn_number
组成一个约束名称。您的问题是您因此每次都隐式声明相同的约束名称,因此名称的旧信息丢失了。只需对 table & column list REFERENCES
table & column list.
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 正如评论中所说,这是一个糟糕的设计。但与评论和另一个答案相反,您需要来自同一个 table 和列列表的两个外键并不是设计不佳的症状。但是请注意,人们通常在有问题的设计中遇到 "Foreign Key Referencing Multiple Tables" 的问题是,他们认为他们的 table 按照设计需要从一个地方到两个地方的外键,而实际上他们不需要。这样的设计甚至不涉及外键,它只是涉及一些让人联想到外键的东西。