首页 > 解决方案 > “多个”外键

问题描述

我有桌子:

然后我将有一个特定的表

哪里rich_person_idmusician_id,programmer_idcop_id。(假设所有的musician_ids, programmer_ids, cop_ids 都是不同的。)

是否可以直接在现场创建外键rich_person_id

PS我希望数据库

PPS 我不喜欢

标签: sqlpostgresqlforeign-keys

解决方案


您可以创建三个可为空的外键,每个外表一个。然后使用CHECK约束确保在任何给定时间只有一个值不为空。

例如:

create table rich_people (
  rich_person_id int primary key not null,
  musician_id int references musicians (musician_id),
  programmer_id int references programmers (programmer_id),
  cop_id int references cops (cop_id),
  check (musician_id is not null and programmer_id is null and cop_id is null
      or musician_id is null and programmer_id is not null and cop_id is null
      or musician_id is null and programmer_id is null and cop_id is not null)
);

这样,将始终确保参照完整性。删除将需要级联删除或其他策略来保持数据完整性。


推荐阅读