powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / INSERT INTO / ON CONFLICT
4 сообщений из 4, страница 1 из 1
INSERT INTO / ON CONFLICT
    #39924089
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
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 там использовать?
...
Рейтинг: 0 / 0
INSERT INTO / ON CONFLICT
    #39924091
Guzya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А зачем там WHERE, Вы же работаете конкретно с конфликтующей строкой.
...
Рейтинг: 0 / 0
INSERT INTO / ON CONFLICT
    #39924553
entrypoint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rgreat,

решение зависит от поля value к которому обращаетесь, или
Код: plsql
1.
2.
3.
4.
5.
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


или
Код: plsql
1.
2.
3.
4.
5.
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
...
Рейтинг: 0 / 0
INSERT INTO / ON CONFLICT
    #39924791
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
entrypoint
rgreat,

решение зависит от поля value к которому обращаетесь, или
Код: plsql
1.
2.
3.
4.
5.
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 еще и результат на выход дает:
Код: sql
1.
2.
3.
4.
5.
6.
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
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / INSERT INTO / ON CONFLICT
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]