@beduin01

Возможна ли проверка условия внутри ON CONFLICT DO UPDATE?

В таблице есть поле id и date и price.
Возможно ли как-то написать такое условие ON CONFLICT DO UPDATE чтобы обновление цены происходило только если date в таблице более старое, чем прилетевшее?
  • Вопрос задан
  • 56 просмотров
Решения вопроса 1
rozhnev
@rozhnev
Fullstack programmer, DBA, медленно, дорого
Это делается следующим образом:
insert into products values (1, '2021-05-01', 150) 
on conflict(id) do update 
set 
	date = case when excluded.date > products.date then excluded.date else products.date end,
	price = case when excluded.date > products.date then excluded.price else products.price end;


PostgreSQL fiddle
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
Melkij
@Melkij
PostgreSQL DBA
Описание синтаксиса весьма красноречиво намекает о реализации
DO UPDATE SET ... WHERE condition

melkij=> create temp table foo (item int primary key, d date, price numeric);
CREATE TABLE
melkij=> insert into foo values (1, '2021-07-30', 100) on conflict (item) do update set price = excluded.price, d = excluded.d where excluded.d > foo.d;
INSERT 0 1
melkij=> table foo;
 item |     d      | price 
------+------------+-------
    1 | 2021-07-30 |   100
(1 строка)

melkij=> insert into foo values (1, '2021-08-01', 110) on conflict (item) do update set price = excluded.price, d = excluded.d where excluded.d > foo.d;
INSERT 0 1
melkij=> table foo;
 item |     d      | price 
------+------------+-------
    1 | 2021-08-01 |   110
(1 строка)

melkij=> insert into foo values (1, '2021-07-20', 80) on conflict (item) do update set price = excluded.price, d = excluded.d where excluded.d > foo.d;
INSERT 0 0
melkij=> table foo;
 item |     d      | price 
------+------------+-------
    1 | 2021-08-01 |   110
(1 строка)
Ответ написан
Комментировать
gbg
@gbg
Любые ответы на любые вопросы
Это делается в триггере.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы