LINUX.ORG.RU

postgresql ON CONFLICT DO UPDATE

 


0

1
[INSERTSRCDST]
dsn=work
writesql=INSERT INTO transfer (clientnumber,number) VALUES ('${SQL_ESC(${VAL1})}','${SQL_ESC(${VAL2})}')
ON CONFLICT (clientnumber)
DO
 UPDATE
   SET number = '${SQL_ESC(${VAL2})}';

Нужно что бы поле number заменялось на VAL2, если clientnumber уже существует. Ни как не пойму как это сделать.. Подскажите пожалуйста.


Так оно и так должно работать, нужно только убедиться, что на clientnumber висит уникальное ограничение, и я бы использовал псевдотаблицу excluded для доступа к вставляемым значениям:

smaximov@/tmp:test> create table transfer (clientnumber text unique, number text);
CREATE TABLE
Time: 0.029s
smaximov@/tmp:test> insert into transfer(clientnumber, number) values ('client 1', 'num 1')
                    on conflict (clientnumber)
                    do update set number = excluded.number
                    returning *;
╒════════════════╤══════════╕
│ clientnumber│ number  │
╞════════════════╪══════════╡
│ client 1    │ num 1   │
╘════════════════╧══════════╛
INSERT 0 1
Time: 0.006s
smaximov@/tmp:test> insert into transfer(clientnumber, number) values ('client 1', 'num 2')
                    on conflict (clientnumber)
                    do update set number = excluded.number
                    returning *;
╒════════════════╤══════════╕
│ clientnumber│ number  │
╞════════════════╪══════════╡
│ client 1    │ num 2   │
╘════════════════╧══════════╛
INSERT 0 1
Time: 0.006s
smaximov@/tmp:test>
theNamelessOne ★★★★★
()
Последнее исправление: theNamelessOne (всего исправлений: 1)
Ответ на: комментарий от theNamelessOne

Спасибо, всё так и делал, но оказывается версия постгре 9.1 в ней не поддерживает он конфликт. Есть какой-то вариант сделать то же но способом, для версии постгре 9.1 ?

madcry
() автор топика
Ответ на: комментарий от madcry

Возможно, получится сделать через триггеры (triggers) / правила (rules), но первые я почти не использовал (а вторые совсем не использовал), так что гугли сам. Даже если получится, решение может быть неоптимальным.

Ещё гугл предлагает использовать для этого PL/pgSQL-функцию.

Ну и самый бескостыльный вариант, наверное, это обновить версию постгреса хотя бы до 9.5, но тут нужные прямые руки.

theNamelessOne ★★★★★
()
Ответ на: комментарий от theNamelessOne

Спасибо, сделал через 2 тригера и 2 функции, update и insert

madcry
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.