簡體   English   中英

如何創建有限的唯一約束

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM