跨列的多个值的 Postgres 唯一约束

时间:2021-03-31 23:54:28

标签: postgresql

我的其中一张表有一个棘手的唯一性要求。

假设我们有一桌狗。狗住在房子里。

CREATE TABLE dogs (
  dog_id integer,
  house_id integer,
  dogname varchar
}

狗的名字在房子里必须是唯一的。还有一个“主”房子,没有狗可能和主房子里的狗有相同的名字。

示例,其中 house_id 0 是“主”房子:

dog_id house_id dogname
1      0        Fido
2      0        Rover
3      1        Shep
4      1        Shep  // FAIL, not unique in house 1
5      2        Shep  // ok, allowed
6      2        Fido  // FAIL, conflict with main house

如何创建对此建模的唯一性约束?

我在想有一种方法可以通过 exclusion 约束来实现,但我还没有想出方法。

我更喜欢使用约束而不是触发器来执行此操作,因为我也想在此表上执行更新插入,并且您只能使用带有约束的 ON CONFLICT。

1 个答案:

答案 0 :(得分:0)

对于未来的访问者:我能解决这个问题的唯一方法是先查询有冲突的记录,然后只有在没有冲突的情况下才进行插入。如果您将两个命令都包装在一个事务中,这将起作用。我必须在应用程序中执行此操作,而不是在数据库级别执行此操作。不是理想的解决方案。