问题:
PostgreSQL 不允许检索预更新更新 UPDATE 语句的 RETURNING 子句中的列值。当寻求在不使用触发器或过程等额外机制的情况下获取更新列的旧值时,这构成了挑战。
使用自连接的解决方案:
一个解决方案是利用 FROM 子句中的自连接。这种技术有效地创建了表的副本,并允许引用更新后的值和更新前的值:
UPDATE tbl x SET tbl_id = 23 , name = 'New Guy' FROM tbl y -- Using the FROM clause WHERE x.tbl_id = y.tbl_id -- Must be UNIQUE NOT NULL AND x.tbl_id = 3 RETURNING y.tbl_id AS old_id, y.name AS old_name , x.tbl_id , x.name;
此方法需要一个 UNIQUE NOT NULL 列进行自连接,确保每行都匹配到连接实例中的单个对应项。
并发写入解决方案负载:
在涉及大量写入并发的场景中,存在两种防止竞争条件的选项:
选项 1:可串行化隔离级别:
利用SERIALIZABLE隔离级别确保事务执行期间对行的独占访问,从而防止并发写入:
BEGIN ISOLATION LEVEL SERIALIZABLE; UPDATE ... ; COMMIT;
选项 2:显式锁定:
或者,可以采用显式锁定来防止行的并发更新:
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 在 PostgreSQL 中更新后检索旧列值?的详细内容。更多信息请关注PHP中文网其他相关文章!