Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / PostgreSQL Новый топик    Ответить
 INSERT INTO / ON CONFLICT  [new]
rgreat
Member

Откуда:
Сообщений: 5622
insert into icg0.db_update
  ( id, value, service ) values ( 'xxxx', now(), 'yyy' )
on conflict ( id )
do update set ( value, service ) = ( now(), 'yyy' )
where now() - value > interval '60' minute


ОШИБКА: неоднозначная ссылка на столбец "value"

Если убрать последнюю строчку - работает.

Что я делаю не так?
И можно ли вообще where там использовать?

Сообщение было отредактировано: 7 фев 20, 22:13
7 фев 20, 22:12    [22075840]     Ответить | Цитировать Сообщить модератору
 Re: INSERT INTO / ON CONFLICT  [new]
Guzya
Member

Откуда:
Сообщений: 415
А зачем там WHERE, Вы же работаете конкретно с конфликтующей строкой.
7 фев 20, 22:45    [22075845]     Ответить | Цитировать Сообщить модератору
 Re: INSERT INTO / ON CONFLICT  [new]
entrypoint
Member

Откуда:
Сообщений: 227
rgreat,

решение зависит от поля value к которому обращаетесь, или
insert into icg0.db_update AS a
  (id, value, service) values ( 'xxxx', now(), 'yyy' )
on conflict ( id )
do update set ( value, service ) = ( now(), 'yyy' )
where now() - a.value > interval '60' minute

или
insert into icg0.db_update
  (id, value, service) values ( 'xxxx', now(), 'yyy' )
on conflict ( id )
do update set ( value, service ) = ( now(), 'yyy' )
where now() - EXCLUDED.value > interval '60' minute


автор
действие_при_конфликте
Параметр действие_при_конфликте задаёт альтернативное действие в случае конфликта. Это может быть либо DO NOTHING (не делать ничего), либо предложение DO UPDATE (произвести изменение), в котором указываются точные детали операции UPDATE, выполняемой в случае конфликта. Предложения SET и WHERE в ON CONFLICT DO UPDATE могут обращаться к существующей строке по имени таблицы (или псевдониму) или к строкам, предлагаемым для добавления, используя специальную таблицу excluded. Для чтения столбцов excluded необходимо иметь право SELECT для соответствующих столбцов в целевой таблице.
https://postgrespro.ru/docs/postgrespro/9.6/sql-insert
10 фев 20, 10:23    [22076544]     Ответить | Цитировать Сообщить модератору
 Re: INSERT INTO / ON CONFLICT  [new]
rgreat
Member

Откуда:
Сообщений: 5622
entrypoint
rgreat,

решение зависит от поля value к которому обращаетесь, или
insert into icg0.db_update AS a
  (id, value, service) values ( 'xxxx', now(), 'yyy' )
on conflict ( id )
do update set ( value, service ) = ( now(), 'yyy' )
where now() - a.value > interval '60' minute

Ага, вот так заработало. Я по привычке AS не написал. А он тут требуемый.
Спасибо!

Guzya
А зачем там WHERE, Вы же работаете конкретно с конфликтующей строкой.

Распараллеливание задач.
Задача обновить только достаточно старые или отсутствующие данные в таблице.

Полная версия SQL еще и результат на выход дает:
INSERT INTO ICG0.DB_UPDATE AS A
  ( ID, VALUE, SERVICE ) VALUES ( 'XXXX', NOW(), 'YYY' )
ON CONFLICT ( ID )
DO UPDATE SET ( VALUE, SERVICE ) = ( NOW(), 'YYY' )
WHERE NOW() -  A.VALUE > INTERVAL '1' MINUTE
RETURNING ID,VALUE
10 фев 20, 17:42    [22077017]     Ответить | Цитировать Сообщить модератору
Все форумы / PostgreSQL Ответить