Postgresql:部分外键?

Postgresql: partial foreign key?

提问人:Ákos Vandra-Meyer 提问时间:11/28/2017 最后编辑:GMBÁkos Vandra-Meyer 更新时间:4/8/2023 访问量:3188

问:

是否可以在一般的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)
SQL 数据库 PostgreSQL 外键 约束

评论

1赞 Juan Carlos Oropeza 11/28/2017
是不可能的,你必须在一个TRIGGER
0赞 philipxy 11/30/2017
我猜你的意思是让一个表是 x 可删除的,当表中的一行在某种意义上变得非当前时,硬意味着你删除它,软意味着你将其标记为非当前。但你应该解释一下自己。同上,“部分唯一索引”和“引用类型”。另外,您的其余写作不清楚,请使用句子而不是片段。(请参阅最小可重现示例
0赞 Ákos Vandra-Meyer 11/30/2017
嗯,我认为软删除的含义在社区中是明确的。让我澄清一下这个问题。
0赞 philipxy 12/1/2017
你好。你的商业案例涉及数据库/sql子类型化/继承/多态性--谷歌这个常见问题。您的设计涉及一个常见的动画模式--谷歌将多个/多个/两个FK转换为多个/多个/两个表。软删除方面是附加的。附言 1.当用户 xxx 不是发帖者并且有多个其他评论者时,您必须使用 @xxx 通知用户 xxx 您的评论。我只是碰巧在这里检查了一下。附言 2.你使用“部分FK”,好像它意味着什么——它不是。我看到“部分索引”似乎是一个 PostgreSQL 手动术语。3. 通过缩进 4 个空格阅读编辑帮助重新代码块格式
0赞 philipxy 12/1/2017
附言 3.如果您在提供代码之前说代码是假的,那将会有所帮助。但这似乎没有意义,因为你没有解释虚假的语法,所以我们不知道“类似的东西”是什么意思。只需使用足够的句子和描述性短语,使用适当的技术术语来真正表达您的意思。

答: 暂无答案