我如何让主键选择要在两个表之间链接的表(特别是主键存在的位置)?

问题描述 投票:0回答:1

我的问题涉及三个表:学生、职员和已发行的图书。 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,我想与该表建立外键。否则,员工表。谢谢。

java sql mysql database database-design
1个回答
0
投票

在您的情况下,您想要强制执行所发行的书籍与学生或教职员工相关,而不是两者都相关,而不是没有。

在这种情况下,两个外键一次只能有一个可为空。您可以通过保持它们都可为空,并添加 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)
);

或者,您可以通过继承设计来解决这个问题。对于关系数据库来说,继承并不是“原生”的东西,而且解决方案充其量也很笨拙。请参阅表继承设计策略

© www.soinside.com 2019 - 2024. All rights reserved.