【问题标题】:How do I combine this update delete and select query into one?如何将此更新删除和选择查询合并为一个?
【发布时间】:2020-06-26 13:21:21
【问题描述】:
  • 我正在尝试实现密码重置页面的功能。
  • 用户获取存储在数据库中的令牌
  • 当用户尝试更新密码时,我想做以下事情
  • 检查令牌是否存在且未过期并获取此类令牌的用户 ID
  • 更新此用户 ID 以更改密码
  • 如果更新成功,则删除此用户 ID 的令牌

这是我能够提出的 3 个单独的查询

SELECT user_id FROM reset_tokens WHERE token = $1 AND now() < expires
UPDATE users SET password=$1 WHERE user_id=$2 RETURNING user_id
DELETE FROM reset_tokens WHERE user_id=$1

如何将这些组合成 1 个查询?谢谢你的建议

如果没有执行更新,则不会发生删除

【问题讨论】:

    标签: sql postgresql sql-update sql-insert sql-delete


    【解决方案1】:

    您可以使用 CTE:

        WITH s as (
              SELECT user_id
              FROM reset_tokens
              WHERE token = $1 AND now() < expires
             ),
             u as (
              UPDATE users
                  SET password = $1
                  WHERE user_id = $2
                  RETURNING user_id
            ),
            d as (
             DELETE FROM reset_tokens
                 WHERE user_id = $1
            )
    SELECT *
    FROM s;
    

    【讨论】:

    • 更新和删除没有被触发?
    猜你喜欢
    • 1970-01-01
    • 2019-01-18
    • 2018-05-29
    • 2016-07-26
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 2019-11-18
    相关资源
    最近更新 更多