gpt4 book ai didi

ruby-on-rails - Postgres 唯一约束忽略空值但 Rails 通过

转载 作者:行者123 更新时间:2023-11-29 13:14:29 24 4
gpt4 key购买 nike

我在我的 postgres 数据库中有一个表 participations 的唯一索引,就像这样

"participation_uniqueness" UNIQUE, btree (event_id, firstname, lastname, email)

这很好用,除了如果其中一个字段为 nil,它基本上会被忽略:

event_id | firstname | lastname | email
1982 | John | Doe | john@doe.de
1982 | Hans | Doe | john@doe.de
1982 | null | null | john@doe.de
1982 | null | null | john@doe.de

如果值为空,我希望唯一性约束也适用,因此上面示例表中的最后一条记录不应该是可能的,因为它违反了唯一性约束。

在 Rails 中,我可以简单地将其作为验证方法添加到我的模型中

validates_uniqueness_of :email, scope: [:event_id, :firstname, :lastname]

我想知道为什么此验证正在考虑使用 NULL 进行唯一性检查,而 SQL 却没有?

研究这个主题,我了解到它是 SQL 标准,因为 NULL 被解释为“缺失信息”,您无法将缺失信息相互比较。

然而,从逻辑的角度来看,这对我来说毫无意义。在这种情况下,我希望数据库插入失败。例如,如果不实现此处发布的肮脏解决方法,我如何才能实现这一目标 https://www.pgrs.net/2008/01/11/postgresql-allows-duplicate-nulls-in-unique-columns/

最佳答案

有一个潜在的答案here使用部分索引。

CREATE UNIQUE INDEX ab_c_null_idx ON my_table (a, b) WHERE c IS NULL;

Rails 的行为不同,因为它在 uniqueness validator 中做了更多的事情.它不只是运行查询。

关于ruby-on-rails - Postgres 唯一约束忽略空值但 Rails 通过,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50813712/

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