[英]Howto create limited unique constraint
我有一個與此類似的表:
CREATE TABLE members (
member_id SERIAL PRIMARY KEY,
email text,
archived boolean DEFAULT FALSE,
CONSTRAINT members_email_key UNIQUE(email)
);
我需要唯一約束僅考慮活動成員(注意已歸檔: archived=False
)。 因此以下內容將有效:
insert into members(name, email) values('ulf','ulf@example.com');
insert into members(name, email) values('foo','foo@example.com');
insert into members(name, email) values('baz','baz@example.com');
update members set archived = True where name = 'ulf';
insert into members(name, email) values('Newulf','ulf@example.com');
但這應該失敗:
insert into members(name, email) values('foo','foo@example.com');
insert into members(name, email) values('Anotherfoo','foo@example.com');
所以我知道我需要像這樣刪除現有的約束:
ALTER TABLE members DROP CONSTRAINT members_email_key;
但是,如何創建一個新的約束來滿足我的需求? 我一直在看EXCLUDE
-clous,但並不完全了解如何應用它。 我嘗試了一些變種而沒有成功:
ALTER TABLE members ADD CONSTRAINT email_for_valid_members EXCLUDE USING gist (email with =, ...
有關EXCLUDE
文檔:
我正在使用PostgreSQL 9.6。
創建部分唯一索引:
create unique index only_one_active_email
on members(email)
where not archived;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.