2017-06-16 46 views
1

我已閱讀:Could I make a column in a table only allows one 'true' value and all other rows should be 'false' - 可以在Postgres中工作,但如果可能的話,我想要一個表的解決方案。Postgres約束可以將表限制爲一個真實值,但許多假值?

我有一個logon_state表:

CREATE TABLE logon_state (
    username VARCHAR(20) references users, 
    region region NOT NULL, 
    channel channel NOT NULL, 
    ts TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), 
    callsign VARCHAR(10) NOT NULL, 
    live BOOLEAN NOT NULL, 
    PRIMARY KEY (username, region, channel) 
); 

我如何添加一個約束或唯一鍵,以便爲每個region/channel組合只有一排可以有true一個live值,而數量不限行可以有一個livefalse

回答

3

可與局部唯一索引來完成:

create unique index on logon_state (region, chanel) 
    where live; 

這假定該域(或類型)regionchanel可以適當比較。如果這些是具有多個字段的記錄類型,則這可能不起作用。

+0

'region'和'channel'是枚舉。這會打破你的答案嗎? – fadedbee

+0

枚舉很好。 – fadedbee