2016-08-08 156 views
0

我有如下表自定義的約束

Column |   Type   |      Modifiers       
-----------+--------------------------+--------------------------------------------------------- 
id  | integer     | not null default nextval('votes_vote_id_seq'::regclass) 
voter  | character varying  | 
votee  | character varying  | 
timestamp | timestamp with time zone | default now() 

目前,我有votervotee唯一約束意味着有每個用戶只有1票

我想執行的條件它允許每週使用時間戳列進行投票。用戶每週只能爲投票人投票一次。

有沒有一種方法,我可以添加自定義約束Postgres的?它們和功能一樣嗎?

回答

0

約束是類似於PostgreSQL中特殊的觸發。

普通觸發器不會做,因爲他們無法看到數據庫的併發修改,所以兩個併發事務都可以看到他們的條件滿足,但他們犯後,病情可能會受到侵犯。

我建議的解決方案是在整個使用SERIALIZABLE交易(大家,包括閱讀器,必須使用他們爲它工作),並驗證在BEFORE觸發你的病情。
SERIALIZABLE將保證上述情況是不可能發生的。