2016-03-21 5 views
0

パーシャルユニークインデックスを持つステートマシンの完全性を保護したいと考えています。 listing_idの場合、status < 3のレコードは1つ以上であってはなりません。言い換えればPostgres:パーシャルユニークインデックス

、これはokです:

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); 

しかし、それは良いことではありません十分に - それは複数のレコードを防止するだけです同じ値の少ないtha上記のマイナスの例は、依然として制約に合格します。

答えて

1

定数にインデックスを作成することで対処できます。方法:

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

@kelorekまあ、listing_idを含める場合は、もう一方の列は必要ありません。 –

+0

ああ、そうだね – kelorek