Postgresql:部分外键?

Áko*_*dra 5 sql database postgresql constraints foreign-keys

是否可以在一般的 sql/postgresql 中创建部分外键(类似于部分索引)?在以下情况下,我还没有找到强制参照完整性的方法:

表 A 是可软删除的(它有一个列已删除的_at,当一行被标记为这样时,它被设置为一个值),而表 B 是可硬删除的(意味着我们实际上删除了行)

表一:

  • ID
  • 删除_at
  • 其他一些东西
  • id 的部分唯一索引,其中 deleted_at 为空

表B:

  • ID
  • 删除_at
  • 其他一些东西
  • id 的部分唯一索引,其中 deleted_at 为空

表 C:

  • 推荐类型
  • 参考编号
  • 其他一些东西

表 A、B、C 中的行代表某个类的对象。它们之间的关系是每个 C 需要引用 A 或 B,由“类型”列的值标记,“id”将标记引用对象的哪个实例。

我想要实现的是强制完整性,以便对于表 C 中引用类型为“MyData::A”的所有行,referred_id 必须与表 A 的部分索引中的行匹配(其中deleted_at 为空),类似地对于 B

就像是

ADD CONSTRAINT name FOREIGN KEY table_C(referred_id)
    REFERENCES table_A(id where deleted_at is not null)
    where referred_type = 'MyData::A
ADD CONSTRAINT name FOREIGN KEY table_C(referred_id)
    REFERENCES table_B(id where deleted_at is not null)
    where referred_type = 'MyData::B
Run Code Online (Sandbox Code Playgroud)

这显然是虚假的语法。

如果这是不可能的,是否可以这样做,而不会在不同的表中存在两种类型的引用对象,如下所示:

    CREATE VIEW A_B_ids AS SELECT id, deleted_at From table_A
UNION SELECT id, deleted_at FROM table_B
ADD CONSTRAINT name FOREIGN KEY table_C(referred_id)
REFERENCES A_B_ids(id where deleted_at is not null)
Run Code Online (Sandbox Code Playgroud)