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

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

Linda Hamilton
发布: 2025-01-04 07:33:34
原创
802 人浏览过

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

仅使用 SQL 检索更新前的列值

在不使用触发器的情况下检索更新后行中列的原始值,存储过程或其他外部实体是 SQL 中反复出现的挑战。为了解决这个问题,我们探索了不同的方法。

初始尝试和缺点

如原始问题中所述,将 FOR UPDATE 与子查询一起使用包含 GROUP BY 子句是不可行的。因此,连接变得不可行。

使用表别名的解决方案

最直接的解决方案是使用表别名将表与其自身连接。通过为表添加别名,我们可以访问原始值和更新后的值。考虑以下更新查询:

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

处理并发写入操作

为了防止并发写入操作影响结果,我们可以使用 FOR UPDATE子查询中的 子句。这可确保仅处理子查询锁定的行。

UPDATE tbl x
SET tbl_id = 24, name = 'New Gal'
FROM (SELECT tbl_id, name FROM tbl WHERE tbl_id = 4 FOR UPDATE) y 
WHERE x.tbl_id = y.tbl_id
RETURNING y.tbl_id AS old_id, y.name AS old_name, x.tbl_id, x.name;
登录后复制

其他注意事项

  • 用于自联接的列必须是唯一的并且 not null。
  • 准确捕获并发需求至关重要
  • 使用 SERIALIZABLE 隔离级别可以确保可靠的并发更新,但会牺牲性能。
  • 或者,使用 FOR UPDATE 显式锁定可以在可靠性和性能之间取得平衡。

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

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