Я делаю INSERT
с ON CONFLICT
, чтобы использовать postgre используя java. Есть ли способ узнать, вставил ли executeUpdate
строку или обновил ее?Обнаруживать, если строка была обновлена или вставлена
ответ
Вы можете посмотреть на 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.
Красота: вам не нужно вводить дополнительные столбцы.
Подробное описание:
, пожалуйста, измените 'INSERT INTO t VALUES (1, 1);' 'INSERT INTO tbl VALUES (1, 1);' - Жаль, что я не могу любить ваш ответ - классные вещи –
@VaoTsun: Спасибо, исправлено. –
- 1. После запроса MYSQL, если строка была обновлена или вставлена
- 2. Как узнать, была ли вставлена новая строка или обновлена ли существующая строка?
- 3. Строка StaleObjectstateException была обновлена или удалена
- 4. Последнее время Среда была обновлена
- 5. SQL-сервер определяет, какая строка была вставлена?
- 6. Получите дату, когда была вставлена строка MySQL
- 7. Cascade Save - StaleObjectStateException: строка была обновлена или удалена другой транзакцией
- 8. Строка была обновлена или удалена другой транзакцией-многопотоком
- 9. StaleObjectStateException: строка была обновлена или удалена другой транзакцией?
- 10. Как получить дату и время, когда одна строка была вставлена / обновлена в Sql Server 2005?
- 11. Выяснение, какая строка была обновлена / удалена JDBC (ResultSet)
- 12. PHPmyAdmin mySQL Trigger: обновить родительскую таблицу, когда дочерняя таблица была вставлена, обновлена или удалена
- 13. В indexedDB, как я могу определить, была ли обновлена или вставлена запись при использовании objectStore.put?
- 14. Обнаруживать, если строка содержит поплавок?
- 15. Как создать триггер, который влияет только на строку, которая была обновлена / вставлена?
- 16. Как проверить, была ли строка таблицы вставлена красноречивым ларавелем?
- 17. Что происходит с индексом, когда строка вставлена или обновлена в mysql?
- 18. Лучший способ проверить, была ли строка обновлена в SQL
- 19. Вывод данных, в которые была вставлена строка в таблицу
- 20. гарантировать, что строка вставлена, если сбой триггера
- 21. Как найти, когда строка вставлена или обновлена в таблице SQL Server
- 22. Репликация SQL Server 2005 межсетевого сервера базы данных - нужно знать, когда строка была вставлена / обновлена на целевом сервере
- 23. Когда последовательность была обновлена oracle
- 24. Обнаружить, если HTML-таблица была вставлена в текстовое поле
- 25. Обнаруживать, если строка выбрана в событии InitializeRow
- 26. Ошибка: строка была обновлена или удалена другой транзакция (или отображение неспасенного значения было неправильным)
- 27. org.hibernate.StaleObjectStateException: строка была обновлена или удалена другой транзакцией (или неверное сопоставление значений было неправильным)
- 28. вызов веб-службы: строка была обновлена или удалена другой транзакцией (или неверное сопоставление неверно)
- 29. return true, если инструкция mysql update excute и false, когда ни одна строка не была обновлена.
- 30. Обнаруживать, если строка соответствует спецификации спецификатора строки
См [Postres upsert: различать новые и обновленные строки] (http://stackoverflow.com/a/38614358/1995738). – klin
К сожалению, я не могу редактировать существующую таблицу, так что это не решило бы проблему. – safyia
Если вы не обновляете конфликт (т. Е. «НЕ НИЧЕГО»), вы можете просто проверить обновленный счетчик строк. Если будет конфликт, будет 0. – teppic