Postgres:部分唯一索引

时间:2016-03-21 18:14:51

标签: postgresql

我希望使用部分唯一索引来保护状态机的完整性。对于给定的listing_idstatus < 3的记录不应超过一条。

换句话说,这没关系:

listing_id, array_agg(status)
1234, {0,3,3}

但这不是:

listing_id, array_agg(status)
1234, {0,1,3}

我的第一个想法是这样的:

CREATE UNIQUE INDEX
  uq_state_machine_protection_per_listing_id
  ON listing_version(listing_id, status)
  WHERE status in (0,1,2);

但这还不够好 - 它只会阻止相同值小于3的多条记录。上面我的否定案例仍会传递约束。

1 个答案:

答案 0 :(得分:1)

可以通过在常量上创建索引来处理它。怎么样:

CREATE UNIQUE INDEX
  uq_state_machine_protection_per_listing_id
  ON listing_version(listing_id)
  WHERE status in (0,1,2);