首页 >数据库 >mysql教程 >如何在 SQL 更新之前检索旧列值?

如何在 SQL 更新之前检索旧列值?

Linda Hamilton
Linda Hamilton原创
2025-01-04 07:39:38135浏览

How to Retrieve Old Column Values Before an SQL UPDATE?

如何在 UPDATE 之前仅使用 SQL 检索旧列值

问题陈述

尽管 SQL 的 RETURNING 子句功能强大,但仍面临一个限制:仅检索更新后的值。在寻求更新列的原始值时,这可能是一个障碍,特别是在高度并发的环境中。

使用自连接的解决方案

Erwin Brandstetter 的解决方案通过使用自连接优雅地解决了这一挑战。在 FROM 子句中加入:

UPDATE my_table
SET processing_by = our_id_info -- unique to this worker
FROM my_table AS old_my_table
WHERE trans_nbr IN (
  SELECT trans_nbr
  FROM my_table
  GROUP BY trans_nbr
  HAVING COUNT(*) > 1
  LIMIT our_limit_to_have_single_process_grab
)
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

通过加入表的另一个实例 (old_my_table),查询可以在更新发生之前无缝检索值。

并发环境的替代方案

在存在大量并发写入负载的情况下,需要采取额外措施来防止竞争条件:

  1. 可序列化隔离级别:在最严格的隔离级别下运行事务,以防止其他事务冲突。
  2. 显式行锁定:向检索要更新的行的子查询添加 FOR UPDATE 子句,确保只处理锁定的行。此技术比使用可序列化隔离级别更有效。

以上是如何在 SQL 更新之前检索旧列值?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn