仅使用 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;
其他注意事项
以上是如何在没有触发器或存储过程的情况下检索 SQL 中更新前的列值?的详细内容。更多信息请关注PHP中文网其他相关文章!