postgresql - 我应该使用 SELECT 还是重复唯一键错误来检查用户和/或电子邮件是否存在?

标签 postgresql validation constraints

与一些同事交谈,他们说我们不应该使用 SELECT 检查唯一键是否已经存在。必须在数据库返回约束错误的情况下完成检查。

我有以下场景:

  1. 我需要向用户返回一条消息,告知用户名是否为 OR 邮箱已经注册(用户名和邮箱是唯一键)。

  2. 我需要生成密码哈希以插入新用户。

如果我根据数据库返回的违反约束的错误验证用户名和电子邮件(两者都是唯一键),我不知道它是用户名还是已经注册的电子邮件。

如果我在检查用户名和电子邮件是否存在之前简单地将用户插入到数据库中,并且其中一个或另一个已经存在,我将浪费不必要的处理时间来生成密码哈希。

在这种情况下,最好的方法是什么?如果在 INSERT 之前使用 SELECT,请考虑数据完整性。

最佳答案

你可以这样进行:

INSERT INTO users (username, email, password)
VALUES ('newuser', 'newemail', NULL)
ON CONFLICT (username) DO NOTHING
RETURNING id;

如果结果为空,则表明与现有用户名发生了冲突。

如果您违反约束,则与现有电子邮件地址发生冲突。

如果你得到一个id,返回,设置密码:

UPDATE users
SET password = 'newpassword'
WHERE id = v_id;

如果表的 fillfactor 小于 100,并且 password 上没有索引(不应该有),这可能是一个高效的 HOT更新。

但我会衡量哈希创建是否比额外的数据库往返更昂贵...

关于postgresql - 我应该使用 SELECT 还是重复唯一键错误来检查用户和/或电子邮件是否存在?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54555576/

相关文章:

java - hibernate 。如何为字段组合添加唯一索引?

mysql - 为什么 sql 数据库不允许为所有查询创建函数而不是在调用程序中构造 sql 字符串?

ruby-on-rails - Rails、Postgres - 将列类型从整数更改为字符串

postgresql - postgresql中多列上的多个索引与单个索引

asp.net-mvc - 在 ASP.NET MVC 3 中自定义模型绑定(bind)错误消息

postgresql - Postgres 9.2 - 添加条件约束检查

sql - 是否有一种安全的方法来修改表 pg_constraint 以便不再进行检查(暂时)?

performance - 如何将一个表中的数据插入/更新到另一个表(postgresql)?

java - 有没有像 Schematics (Python) for Java 这样的工具?

validation - 检查自定义验证器中的必填字段