PostgreSQL INSERT ON CONFLICT RETURNING: получить id строки
В PostgreSQL добавьте RETURNING после INSERT ... ON CONFLICT, чтобы получить id вставленной или обновлённой строки одним запросом. Это избавляет от второго SELECT и гонок между запросами.
Рабочий пример
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 с нужным ключом.