powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Postgres 9.5:"INSERT INTO ... ON CONFLICT" - Как понять произошла вставка или обновление?
3 сообщений из 3, страница 1 из 1
Postgres 9.5:"INSERT INTO ... ON CONFLICT" - Как понять произошла вставка или обновление?
    #39274504
shaposh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Postgres 9.5:"INSERT INTO ... ON CONFLICT" - Как понять произошла вставка или обновление?
    #39274523
shaposh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сорри, в 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
Postgres 9.5:"INSERT INTO ... ON CONFLICT" - Как понять произошла вставка или обновление?
    #39276317
Фотография grufos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
3 сообщений из 3, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Postgres 9.5:"INSERT INTO ... ON CONFLICT" - Как понять произошла вставка или обновление?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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