Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Postgres 9.5:"INSERT INTO ... ON CONFLICT" - Как понять произошла вставка или обновление? / 3 сообщений из 3, страница 1 из 1
15.07.2016, 12:17
    #39274504
shaposh
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Postgres 9.5:"INSERT INTO ... ON CONFLICT" - Как понять произошла вставка или обновление?
Postgres 9.5
Как в конструкции
Код: plsql
1.
2.
3.
4.
5.
6.
   INSERT INTO table (Id, Name)
        VALUES (:in_Id, :in_Name)
   ON CONFLICT (Id)
            DO             
        UPDATE 
           SET name = :in_name



понять какая операция была выполнена - вставка или обновление?

В Firebird в аналогичной конструкции "UPDATE OR INSERT" это достигается так:
Код: plsql
1.
   UPDATE OR INSERT INTO table (Id, Name) VALUES (:in_Id, :in_Name) RETURNING OLD.Id



т.е можно указать префикс перед возвращаемым PK: если он NULL, то произошла вставка...

А как получить информацию о том была вставка или обновление в Postgres?
...
Рейтинг: 0 / 0
15.07.2016, 12:32
    #39274523
shaposh
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Postgres 9.5:"INSERT INTO ... ON CONFLICT" - Как понять произошла вставка или обновление?
Сорри, в Firebird конечно же так:
Код: plsql
1.
2.
3.
4.
UPDATE OR INSERT INTO table (Id, Name)
          VALUES (:in_Id, :in_Name)
        MATCHING (Id)
       RETURNING OLD.Id
...
Рейтинг: 0 / 0
19.07.2016, 14:51
    #39276317
grufos
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Postgres 9.5:"INSERT INTO ... ON CONFLICT" - Как понять произошла вставка или обновление?
shaposh,

можно решить эту проблему путём использования системной невидимой колонки xmax
https://www.postgresql.org/docs/9.5/static/ddl-system-columns.html
https://postgrespro.ru/docs/postgrespro/9.5/ddl-system-columns.html

тест
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
CREATE TABLE account
(
  id bigserial,
  name varchar,
  surname varchar,
  address varchar,
  PRIMARY KEY (id),
  CONSTRAINT unique_person UNIQUE (name, surname, address)
);

INSERT INTO account as a (id, name, surname, address)
VALUES (1, 'Вася', 'Пупкин', 'Москва, Кремль')
ON CONFLICT (id)
DO UPDATE SET
name=EXCLUDED.name || ' (бывший ' || a.name || ')',
surname=EXCLUDED.surname || ' (бывший ' || a.surname || ')'
returning xmax, * ;

xmax	id	name	surname	address
0	1	Вася	Пупкин	Москва, Кремль

INSERT INTO account AS a (id, name, surname, address)
VALUES (1, 'Петя', 'Петров', 'Москва, Кремль')
ON CONFLICT (id)
DO UPDATE SET
name=EXCLUDED.name || ' (бывший ' || a.name || ')',
surname=EXCLUDED.surname || ' (бывший ' || a.surname || ')'
returning xmax, * ;

xmax	       id	name	                        surname	                        address
22087375	1	Петя (бывший Вася)	Петров (бывший Пупкин)	Москва, Кремль



т.е.
0 - выполнена вставка
не 0 - выполнен update
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Postgres 9.5:"INSERT INTO ... ON CONFLICT" - Как понять произошла вставка или обновление? / 3 сообщений из 3, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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