【问题标题】:Should I use SELECT or the duplicate unique key error to check if user and/or email exist?我应该使用 SELECT 还是重复唯一键错误来检查用户和/或电子邮件是否存在?
【发布时间】:2019-02-06 14:09:55
【问题描述】:

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

我有以下场景:

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

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

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

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

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

【问题讨论】:

    标签: postgresql validation constraints


    【解决方案1】:

    你可以这样继续:

    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 更新。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-15
      • 1970-01-01
      • 2016-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-25
      相关资源
      最近更新 更多