【问题标题】:postgresql - unique with extract constraintpostgresql - 具有提取约束的唯一性
【发布时间】: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


    【解决方案1】:

    您不需要排除约束。

    部分唯一索引就足够了

    create unique index unique_active_name 
       on app_user (name)
       where is_active;
    

    (假设is_active 定义为boolean

    【讨论】:

      猜你喜欢
      • 2013-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-20
      • 1970-01-01
      • 1970-01-01
      • 2018-12-02
      • 1970-01-01
      相关资源
      最近更新 更多