Может ли Postgres молча игнорировать конфликты ограничений столбцов?

У меня есть таблица Postgres 9.6 с определенными столбцами, которые должны быть уникальными. Если я попытаюсь вставить повторяющуюся строку, я хочу, чтобы Postgres просто проигнорировал вставку и продолжил, а не терпел неудачу или прерывал работу. Если вставка включена в транзакцию, она не должна прерывать транзакцию или влиять на другие обновления в транзакции.

Я предполагаю, что есть способ создать таблицу, как описано выше, но я еще не понял этого.

Бонусные баллы, если вы можете показать мне, как это сделать в Rails.


person Barry Fruitman    schedule 06.01.2017    source источник


Ответы (1)


Это возможно с помощью ON CONFLICT для INSERT< /а>:

Необязательное предложение ON CONFLICT задает действие, альтернативное выдаче уникального нарушения или ошибки нарушения ограничения исключения. Для каждой отдельной строки, предлагаемой для вставки, либо вставка продолжается, либо, если нарушается ограничение арбитра или индекс, указанный в конфликте_цели, выполняется альтернативное конфликтное_действие. ON CONFLICT DO NOTHING просто избегает вставки строки в качестве альтернативного действия.

Это относительно новая функция, доступная только начиная с Postgres 9.5, но для вас это не проблема.

Это не то, что вы указываете при создании таблицы, вам нужно будет изменить каждую вставку. Я не знаю, как это работает с Rails, но полагаю, вам придется вручную написать хотя бы часть запросов, чтобы сделать это.

Эта функция также часто называется UPSERT, что, вероятно, является лучшим термином для поиска, если вы хотите найти интегрированный способ сделать это в Rails.

person Mad Scientist    schedule 06.01.2017