Как заставить postgres игнорировать вставки с дублирующим ключом, но продолжать
Я вставляю данные записей из коллекции в память в postgres и хочу, чтобы база данных игнорировала любую запись, которая уже существует в базе данных (в силу наличия того же первичного ключа), но продолжала работать с остальными моими вставками.
Я использую clojure и hugsql, кстати, но я предполагаю, что ответ может быть независимым от языка.
Так как я, по сути, отношусь к базе данных как к множеству таким образом, я могу использовать антипаттерн.
1 ответ
Если вы используете Postgres 9.5 или новее (как я полагаю, так как он был выпущен еще в январе 2016 года), есть очень полезный ON CONFLICT
Cluase вы можете использовать:
INSERT INTO mytable (id, col1, col2)
VALUES (123, 'some_value', 'some_other_value')
ON CONFLICT (id) DO NOTHING
Мне пришлось решить эту проблему для ранней версии Postgres, поэтому вместо одного оператора INSERT с несколькими строками я использовал несколько операторов INSERT и просто запустил их все в сценарии и убедился, что ошибка не остановит сценарий (я использовал Adminer с снятым флажком "останавливать при ошибке"), так что те, которые не вызывают ошибки, выполняются, а затем вставляются все новые записи.