提问人:Ákos Vandra-Meyer 提问时间:11/28/2017 最后编辑:GMBÁkos Vandra-Meyer 更新时间:4/8/2023 访问量:3188
Postgresql:部分外键?
Postgresql: partial foreign key?
问:
是否可以在一般的sql / postgresql中创建部分外键(类似于部分索引)?在以下情况下,我还没有找到强制引用完整性的方法:
表 A 是可软删除的(它有一个列deleted_at,当要标记一行时,该列被设置为一个值),而表 B 是可硬删除的(这意味着我们实际上删除了这些行)
表A:
- 编号
- deleted_at
- 其他一些东西
- ID 的部分唯一索引,其中 deleted_at为 null
表B:
- 编号
- deleted_at
- 其他一些东西
- ID 的部分唯一索引,其中 deleted_at为 null
表C:
- 参考类型
- 推荐 ID
- 其他一些东西
表 A、B、C 中的行表示某个类的对象。它们之间的关系,每个 C 都需要引用 A 或 B,由“type”列的值标记,而“id”将标记引用对象的哪个实例。
我想实现的是强制完整性,以便对于表 C 中引用类型为“MyData::A”的所有行,referred_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)
答: 暂无答案
上一个:在SQLite中处理表情符号
评论
TRIGGER