postgresql-具有提取约束的唯一性

postgresql-具有提取约束的唯一性,postgresql,unique-constraint,Postgresql,Unique Constraint,这是我遇到的唯一约束问题:假设我有一个table app_用户。它有一列“name”,一列“is_active”。因此,如果“is_active”为false,则删除该用户 现在我想在“name”列上有一个唯一的约束。然后一个用户被删除,然后有人想再次添加一个同名的用户,由于唯一性约束,它失败了。我可以将该检查放在上层(对于用户触发的操作,虽然这是额外的代码,但并不经常发生,这可能足够安全) 但是我想设置一个PostgreSQL唯一约束,该约束只对is_active=true的行进行操作 我已经

这是我遇到的唯一约束问题:假设我有一个table app_用户。它有一列“name”,一列“is_active”。因此,如果“is_active”为false,则删除该用户

现在我想在“name”列上有一个唯一的约束。然后一个用户被删除,然后有人想再次添加一个同名的用户,由于唯一性约束,它失败了。我可以将该检查放在上层(对于用户触发的操作,虽然这是额外的代码,但并不经常发生,这可能足够安全)

但是我想设置一个PostgreSQL唯一约束,该约束只对is_active=true的行进行操作

我已经研究了PostgreSQL 9的排除功能

我想出了这样的主意:

alter table test add exclude (name with =, is_active with ||)
所以这个想法是,有一个独特的冲突,我必须让两个名字相等,而且两个都是真的。不幸的是,
|
操作符在这种情况下不存在

有什么可以实现的吗?或者,您是否建议其他仍然符合要求的解决方案(能够重新创建与已删除用户同名的用户)?一种选择是说,这是不可能的,但是阻止用户永远访问某个用户名有点强

此外,业务逻辑并不真正依赖于不重复,但它仍然是一种健康的做法来防止它。在本例中,我将在系统中导入数据,并按名称进行导入。因此,如果我有两个同名的记录,我就会有问题。如果有一条同名记录在6个月前被删除,同时又创建了一条新的记录,这不是问题


如果有一个与其他SQL Server兼容的解决方案,我会非常高兴,但我怀疑它是否存在。。。另外,我不希望添加额外的表来实现这一点。所以我想要么是排除方法要么什么都没有…

您不需要排除约束

部分唯一索引就足够了

create unique index unique_active_name 
   on app_user (name)
   where is_active;
(这假设
处于活动状态
定义为
布尔值