gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 12:45:17 25 4
gpt4 key购买 nike

这里是我遇到的唯一约束问题:假设我有一个表 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 方式,要么什么都不是......

最佳答案

您不需要排除约束。

部分唯一索引就足够了

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

(假设 is_active 定义为 boolean)

关于postgresql - 具有提取约束的唯一性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26487898/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com