首页 > 数据库 > mysql教程 > 如何在不使用触发器或存储过程的情况下检索 SQL 中更新前的列值?

如何在不使用触发器或存储过程的情况下检索 SQL 中更新前的列值?

Linda Hamilton
发布: 2025-01-03 18:51:39
原创
615 人浏览过

How Can I Retrieve Pre-Update Column Values in SQL Without Using Triggers or Stored Procedures?

仅使用 SQL 检索更新前值

在触发器、存储过程或外部实体不可用的场景中,有必要从单独使用 SQL 更新的行中检索列的旧值。

挑战

直接从 RETURNING 子句检索更新前的值是不可能的,因为它只返回更新后的值。

使用自连接的解决方案

解决方案是使用唯一标识要更新的行的条件将表连接到其自身的另一个实例。这允许访问 RETURNING 子句中的旧值和新值。

UPDATE my_table
SET processing_by = our_id_info
FROM my_table AS old_my_table
WHERE old_my_table.trans_nbr = my_table.trans_nbr
AND my_table.row_id = old_my_table.row_id
RETURNING my_table.row_id, my_table.processing_by, old_my_table.processing_by AS old_processing_by
登录后复制

处理并发

为了避免潜在的竞争条件,防止并发写入至关重要更新期间相同的行。这可以通过对要更新的行使用显式锁定来实现:

UPDATE my_table
SET processing_by = our_id_info
FROM (SELECT * FROM my_table WHERE trans_nbr = 4 FOR UPDATE) AS old_my_table
WHERE old_my_table.trans_nbr = my_table.trans_nbr
RETURNING my_table.row_id, my_table.processing_by, old_my_table.processing_by AS old_processing_by
登录后复制

这可确保仅处理由子查询锁定的行,从而防止更新冲突。

以上是如何在不使用触发器或存储过程的情况下检索 SQL 中更新前的列值?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板