更喜欢更新是一个好主意...返回而不是带有更新和选择的两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语句中声明逻辑的优点使其通过减少往返,增加透明检索的可能性(例如,在时钟偏斜上),即使在读取的隔离级别中也避免异常。