Postgresql:部分外键?

时间:2017-11-28 13:01:42

标签: sql database postgresql foreign-keys constraints

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

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

表A:

  • ID
  • deleted_at
  • 其他一些东西
  • id的部分唯一索引,其中deleted_at为null

表B:

  • ID
  • deleted_at
  • 其他一些东西
  • id的部分唯一索引,其中deleted_at为null

表C:

  • 推荐类型
  • 引用id
  • 其他一些东西

表A,B,C中的行表示某个类的对象。每个C需要引用A或B的关系,由“type”列的值标记,以及“id”将标记该对象的哪个实例被引用。

我想要实现的是强制完整性,以便对于表C中所有引用类型为'MyData :: A'的行,referenced_id必须匹配表A的部分索引中的行(其中deleted_at为null ),类似于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

这显然是伪造的语法。

如果这是不可能的话,是否可以这样做,而不必讨论在不同的表中有两种类型的引用对象的可能性,如下所示:

    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)

0 个答案:

没有答案