我有一个类似于这样的表:
CREATE TABLE members (
member_id SERIAL PRIMARY KEY,
email text,
archived boolean DEFAULT FALSE,
CONSTRAINT members_email_key UNIQUE(email)
);
我需要unique-constraint才能只考虑活动成员(注释存档:archived=False
)。所以以下内容是有效的:
insert into members(name, email) values('ulf','[email protected]');
insert into members(name, email) values('foo','[email protected]');
insert into members(name, email) values('baz','[email protected]');
update members set archived = True where name = 'ulf';
insert into members(name, email) values('Newulf','[email protected]');
但这应该失败:
insert into members(name, email) values('foo','[email protected]');
insert into members(name, email) values('Anotherfoo','[email protected]');
所以我知道我需要删除现有的约束,如下所示:
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;