2016-11-30 5 views
2

Я делаю INSERT с ON CONFLICT, чтобы использовать postgre используя java. Есть ли способ узнать, вставил ли executeUpdate строку или обновил ее?Обнаруживать, если строка была обновлена ​​или вставлена ​​

+1

См [Postres upsert: различать новые и обновленные строки] (http://stackoverflow.com/a/38614358/1995738). – klin

+0

К сожалению, я не могу редактировать существующую таблицу, так что это не решило бы проблему. – safyia

+0

Если вы не обновляете конфликт (т. Е. «НЕ НИЧЕГО»), вы можете просто проверить обновленный счетчик строк. Если будет конфликт, будет 0. – teppic

ответ

3

Вы можете посмотреть на system column xmax, чтобы указать разницу. Это значение 0 для вставленных строк в этом случае.

CREATE TABLE tbl(id int PRIMARY KEY, col int); 
INSERT INTO tbl VALUES (1, 1); 
INSERT INTO tbl(id, col) 
VALUES (1,11), (2,22) 
ON  CONFLICT (id) DO UPDATE 
SET col = EXCLUDED.col 
RETURNING *, (xmax = 0) AS inserted;

Это строит на недокументированных деталей реализации, что может измениться в будущих версиях (даже если маловероятно). Он работает для Postgres 9.5 и 9.6.

Красота: вам не нужно вводить дополнительные столбцы.

Подробное описание:

+0

, пожалуйста, измените 'INSERT INTO t VALUES (1, 1);' 'INSERT INTO tbl VALUES (1, 1);' - Жаль, что я не могу любить ваш ответ - классные вещи –

+0

@VaoTsun: Спасибо, исправлено. –

Смежные вопросы