Postgres:使用条件创建唯一索引

Nev*_*evD 4 postgresql index

我在 Postgres 中有一个表,其中记录类型为[event_id, user_id, status]。用户的范围是每个事件的,因此我有一个唯一的索引,[event_id, user_id]以便用户具有唯一的状态。状态是枚举类型。

但是,我最多只能拥有一条 status=owner 的记录。我正在尝试放置一个条件索引,例如[event_id, status] where "status" == "owner".

[ev, user, status]
[1,  1,    owner]   <- ok
[1,  2,    owner]   <- wrong
[1,  2,    pending] <- ok
[1,  3,    pending] <- ok
Run Code Online (Sandbox Code Playgroud)

有任何线索如何做到这一点吗?

ype*_*eᵀᴹ 6

是的,语法几乎就是你想象的那样。它们称为部分索引(或过滤索引)并且可以是唯一的。

CREATE UNIQUE INDEX event_unique_ower_uqx    -- index name
    ON table_name (event_id) 
    WHERE (status = 'owner') ;
Run Code Online (Sandbox Code Playgroud)

这实质上是说:

“不允许多于一行的状态'owner' 相同event_id。”

该索引对任何status不同于 的行没有任何限制'owner'