更新返回旧| Yugabytedb和PostgreSQL的新事物
#postgres #database #yugabytedb #distributed

更喜欢更新是一个好主意...返回而不是带有更新和选择的两statement交易。默认情况下,返回新值。 Oracle 23C已将可能性添加到return the old values

这是如何在yugabytedb和postgresql中进行相同的操作。

yugabyte=# create table demo (id bigint primary key, value text);
CREATE TABLE

yugabyte=# insert into demo 
           select generate_series(1,50), '...old...';
INSERT 0 50

yugabyte=# update demo set value='...new...' where id=42
           returning id, value;

 id |   value
----+-----------
 42 | ...new...
(1 row)

UPDATE 1

这是我运行相同的方式以返回旧值:

yugabyte=# with old as (select * from demo where id=42)
           update demo new set value='...new...'
           from old where old.id=new.id
           returning new.id, old.value, new.value ;

 id | old_value | new_value
----+-----------+-----------
 42 | ...old... | ...new...

(1 row)

UPDATE 1

with with子句(也称为COME表达式的CTE)对于在一个语句中进行多个读取和编写操作非常有帮助。在单个SQL语句中声明逻辑的优点使其通过减少往返,增加透明检索的可能性(例如,在时钟偏斜上),即使在读取的隔离级别中也避免异常。