【问题标题】:Howto create limited unique constraint如何创建有限的唯一约束
【发布时间】: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的文档:

我正在使用 postgresql 9.6。

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

    创建部分唯一索引:

    create unique index only_one_active_email
       on members(email)
    where not archived;
    

    【讨论】:

      猜你喜欢
      • 2010-09-09
      • 2019-04-24
      • 2019-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多