PostgreSQL INSERT ON CONFLICT RETURNING: получить id строки

Категория: Postgresql · Язык: SQL · Обновлено:

В PostgreSQL добавьте RETURNING после INSERT ... ON CONFLICT, чтобы получить id вставленной или обновлённой строки одним запросом. Это избавляет от второго SELECT и гонок между запросами.

Рабочий пример

SQL
CREATE TEMP TABLE accounts(email text UNIQUE, display_name text);
INSERT INTO accounts VALUES ('a@example.test', 'Anna');
INSERT INTO accounts(email, display_name)
VALUES ('a@example.test', 'Anna K.')
ON CONFLICT (email) DO UPDATE SET display_name = EXCLUDED.display_name
RETURNING email, display_name, (SELECT count(*) FROM accounts) AS rows_total;

EXCLUDED содержит значения предлагаемой вставки. RETURNING видит итоговую строку после INSERT или UPDATE и возвращает только выбранные поля.

Частый вопрос

Вернёт ли DO NOTHING id существующей строки?

Нет. RETURNING отдаёт строки, изменённые этим statement. Для существующей записи выполните SELECT с нужным ключом.