【发布时间】:2014-12-16 17:58:08
【问题描述】:
这是我遇到的唯一约束问题:假设我有一个表 app_user。它有一列“名称”和一列“is_active”。所以如果“is_active”为假,用户就被删除了。
现在我想要对“名称”列进行唯一约束。然后一个用户被删除,然后有人想再次添加一个同名的用户,它失败了,因为唯一的约束。我可以将该检查放在上层(对于实际上并不经常发生的用户触发的操作,它可能足够安全,尽管它是额外的代码)。
但我想设置一个 PostgreSQL 唯一约束,它只对 is_active=true 的行进行操作。
我查看了 PostgreSQL 9 EXCLUDES 功能。
我想出了类似的东西:
alter table test add exclude (name with =, is_active with ||)
所以想法是,为了有一个独特的冲突,我必须让两个名字相等,并且两个 is_active 也必须为真。遗憾的是,|| 运算符在这种情况下不存在。
到底有没有可以实现的?或者您是否建议其他仍然尊重要求的解决方案(能够重新创建与已删除用户同名的用户)?一种选择是说,这是不可能的,但是阻止用户永远访问某个用户名有点强。
此外,业务逻辑并不真正依赖于非重复,但防止它仍然是一种健康的做法。在这种情况下,我将在系统中导入数据,并且导入是按名称完成的。因此,如果我有两条同名的记录,我就会遇到问题。如果有一条同名的记录在 6 个月前被删除,同时又创建了一条新记录,那不是问题。
如果有一个解决方案也与其他 SQL 服务器兼容,我会非常高兴,但我怀疑是否存在......另外,我宁愿不添加额外的表来实现这一点。所以我想这要么是 EXCLUDE 方式,要么什么都没有......
【问题讨论】:
标签: postgresql unique-constraint