仅使用 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中文网其他相关文章!