2017-02-23 67 views
0

我想修改表约束。从现在起,名字必须是独一无二的。但是,我想要具有唯一的名称,只有当给定名称的行是活动的。所以我添加了列is_active。将UNIQUE约束转换为CHECK或触发器

CREATE TABLE item 
(
(...) 
name character varying(50) NOT NULL, 
is_active boolean NOT NULL DEFAULT true, 
CONSTRAINT uc_item_name UNIQUE (name), 
(...) 
) 

我可以删除唯一约束,并添加触发器或函数调用,它会这么做:

  • 如果给新名称未在表回报存在真实的或允许 插入,
  • 如果给出至少一行中的新名称退出,重复执行 ,并检查是否至少有一个是活动的。如果是 - 失败插入 否则将行添加到表中。

任何人都可以帮我吗?这只是我与Postgres的冒险开始。我使用的是9.6版

回答

4

您可以创建一个部分唯一索引:

create unique index on item (name) 
where is_active; 
+0

这就是anwser!谢谢。我只是想知道如果我能够通过CHECK约束来调用返回布尔值的函数。可能吗?我问,因为我认为这将是实现我的目标的最优雅的方式 –

+1

@Konrad:在默认[隔离级别](https://www.postgresql.org/docs/current/static/transaction-iso html的);两个使用相同'name'的同时插入不能看到对方,并且两者都会通过检查。一个唯一的索引自动处理并发。 –