是否可以在一般sql / postgresql中创建部分外键(类似于部分索引)?在下列情况下,我没有找到强制引用完整性的方法:
表A是软删除的(它有一个列deleted_at,当一行被标记为时,它被设置为一个值),而表B是硬删除的(意味着我们实际上删除了行)
表A:
表B:
表C:
表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)