PostgreSQL - 外键引用互斥表

Osh*_*ott 6 postgresql

我有三个数据库表:ALIENS、MONSTERS 和 TROPHIES。

每个 ALIEN 可以有多个 TROPHIES。每个 MONSTER 可以有多个奖杯。每个 TROPHY 必须有一个 WINNER (ALIEN XOR MONSTER)。

有没有办法在 TROPHY 表中有一个引用 ALIEN 或 MONSTER 主键的外键?

还是简单地拥有两个表更容易:一个 ALIEN_TROPHY 表和一个 MONSTER_TROPHY 表(即使它们是相同的)?

And*_*mar 2

您可以创建两个带有检查约束的外键,其中一个为空:

create table alien (id int primary key);
create table monster (id int primary key);
create table trophy (id int primary key,
    alien_id int references alien(id),
    monster_id int references monster(id),
    check (alien_id is null <> monster_id is null)
);
Run Code Online (Sandbox Code Playgroud)