我希望使用部分唯一索引来保护状态机的完整性。对于给定的listing_id
,status < 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的多条记录。上面我的否定案例仍会传递约束。
答案 0 :(得分:1)
可以通过在常量上创建索引来处理它。怎么样:
CREATE UNIQUE INDEX
uq_state_machine_protection_per_listing_id
ON listing_version(listing_id)
WHERE status in (0,1,2);