2012-06-07 20 views
8

は考える:VINごとに1つだけ所有者が存在するように制約を追加する方法はのPostgreSQL:条件付きのユニークな制約

---------------------------------- 
     vin  | driver | is_owner 
--------------+--------+---------- 
231431cxzv87 | bob | true 
231431cxzv87 | jeff | false 
231431cxzv87 | greg | false 
32342klj234s | jeff | true 

ありますか?


編集:私はthis questionを発見しました。
この目的に合ったpartial unique indexを追加していますか?

+0

はい、部分的な一意のインデックスが必要です。 –

答えて

13

はい部分インデックスは選択です。ここで

create unique index unique__vin on table (vin) where is_owner; 

指数はis_ownerがtrueで、この行Vinをwithingは一意である必要があります行のみをカバーしています。

+0

インデックスを使用するのと違って、制約/チェック規則がない理由は何ですか? – vol7ron

+0

@ vol7ron:おそらく制約は(定義によって)常にテーブル内のすべての行に適用されるためです。 –

+0

AFAIKに制約を追加すると、vinの一意性をチェックするときにクエリテーブルが必要になります。表を照会すると、索引スキャンが行われます。あなたはまだインデックスを使用しますが、私は各小切手があなたにより多くのポイントを要すると思います。 – kworr

関連する問題