首页 > 数据库 > mysql教程 > 如何仅使用 SQL 在 PostgreSQL 中更新后检索旧列值?

如何仅使用 SQL 在 PostgreSQL 中更新后检索旧列值?

DDD
发布: 2025-01-06 00:52:39
原创
263 人浏览过

How to Retrieve Old Column Values After an UPDATE in PostgreSQL Using Only SQL?

如何仅使用 SQL 获取预更新列值

问题:

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

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