【发布时间】:2018-03-01 18:17:22
【问题描述】:
我有一个类似这样的表:
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的文档:
- https://www.postgresql.org/docs/9.6/static/sql-altertable.html
- https://www.postgresql.org/docs/9.6/static/sql-createtable.html
我正在使用 postgresql 9.6。
【问题讨论】:
标签: sql postgresql