与一些同事交谈,他们说我们不应该使用 SELECT 检查唯一键是否已经存在。必须在数据库返回约束错误的情况下完成检查。
我有以下场景:
我需要向用户返回一条消息,告知用户名是否为 OR 邮箱已经注册(用户名和邮箱是唯一键)。
我需要生成密码哈希以插入新用户。
如果我根据数据库返回的违反约束的错误验证用户名和电子邮件(两者都是唯一键),我不知道它是用户名还是已经注册的电子邮件。
如果我在检查用户名和电子邮件是否存在之前简单地将用户插入到数据库中,并且其中一个或另一个已经存在,我将浪费不必要的处理时间来生成密码哈希。
在这种情况下,最好的方法是什么?如果在 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/