如何在 PostgreSQL 更新语句中重用新分配的列

How to reuse a newly assign column in a PostgreSQL update sentence

从这个简单的例子可以清楚地看出,update 句子中某列的新赋值不能简单地在其他列赋值中重复使用。

drop table if exists stocks cascade;

create table stocks (
    id              serial,
    stock_available int,
    stock_locked    int
);

insert into stocks(stock_available, stock_locked) values 
(100, 10),
(100, 10),
(100, 10),
(100, 10),
(100, 10);

update stocks
set stock_available = 5, stock_locked = stock_available + 1;

select * from stocks;

id|stock_available|stock_locked|
--|---------------|------------|
 1|              5|         101|
 2|              5|         101|
 3|              5|         101|
 4|              5|         101|
 5|              5|         101|

我想知道是否有类似 excluded 的更新。

更新语句中没有“排除”子句。但是有一个“include”子句:WHERE。 WHERE 子句定义各个行必须满足的条件。例如:

update stocks
   set stock_available = 5
     , stock_locked = stock_available + 1  
 where id = 3;

您可以通过在 WHERE 中指定 NOT 条件来有效地创建“排除”。所以(不好用一个not条件,但是会演示)

update stocks
   set stock_available = 7
     , stock_locked = stock_available + 1  
 where id NOT < 4; 

WHERE 对 select 和 delete 语句执行完全相同的操作。即定义符合指定操作条件的行。