如何将此更新delete和select查询组合成一个查询?

unhi4e5o  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(306)

我正在尝试实现密码重置页面的功能。
用户获取存储在数据库中的令牌
当用户尝试更新密码时,我想执行以下操作
检查令牌是否存在且尚未过期,并获取该令牌的用户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

如何将这些合并到一个查询中?谢谢你的建议
如果没有执行更新,则不会发生删除

ebdffaop

ebdffaop1#

您可以使用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;

相关问题