如何创建有限的唯一约束

问题描述 投票:0回答:1

我有一个类似于这样的表:

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。

sql postgresql
1个回答
2
投票

创建部分唯一索引:

create unique index only_one_active_email
   on members(email)
where not archived;
© www.soinside.com 2019 - 2024. All rights reserved.