Как повторно использовать недавно назначенный столбец в предложении обновления PostgreSQL

#postgresql #sql-update #postgresql-12

#postgresql #sql-обновление #postgresql-12

Вопрос:

Из этого простого примера ясно, что вновь присвоенное значение столбца в 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 для обновлений.

Ответ №1:

В инструкции update нет предложения «исключить». Однако существует предложение «включить»: ГДЕ. Предложение WHERE определяет условия, которым должны удовлетворять отдельные строки. Так, например:

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

Вы можете эффективно создать «исключить», указав условие NOT в WHERE. Итак (плохое использование условия not, но оно продемонстрирует)

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

WHERE выполняет точно то же самое для операторов select и delete. А именно, чтобы определить строки, которые соответствуют требованиям для указанной операции.

Комментарии:

1. Итак, это так просто, как update stocks set stock_available = 5, stock_locked = stock_available 1 where id = id;