我的问题涉及三个表:学生、职员和已发行的图书。 Issued_books 表具有 book_id 列(引用 books 表)和 user_id 列(引用 Students 或 Staff 表,具体取决于两个表中哪一个具有插入的 user_id)。
CREATE TABLE issued_books(
issue_id int AUTO_INCREMENT PRIMARY KEY,
book_id VARCHAR(15) NOT NULL,
user_id VARCHAR(15) NOT NULL,
-- other column
FOREIGN KEY (book_id) REFERENCES books (book_id),
FOREIGN KEY (user_id) REFERENCES students (user_id),
FOREIGN KEY (user_id) REFERENCES staff (user_id)
);
这就是我所拥有的。如果在students表中找到user_id,我想与该表建立外键。否则,员工表。谢谢。
在您的情况下,您想要强制执行所发行的书籍与学生或教职员工相关,而不是两者都相关,而不是没有。
在这种情况下,两个外键一次只能有一个可为空。您可以通过保持它们都可为空,并添加 CHECK 约束来强制它们在任何给定时间只有一个为空。
例如,您可以这样做:
create table issued_books (
issue_id int primary key,
book_id varchar(15) not null,
student_id varchar(15) null, -- nullable
staff_id varchar(15) null, -- nullable
-- other columns
foreign key (book_id) references books (book_id),
foreign key (student_id) references students (user_id),
foreign key (staff_id) references staff (user_id),
check (student_id is null and staff_id is not null or
student_id is not null and staff_id is null)
);
或者,您可以通过继承设计来解决这个问题。对于关系数据库来说,继承并不是“原生”的东西,而且解决方案充其量也很笨拙。请参阅表继承设计策略。