2017-01-06 14 views
1

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

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

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

ответ

4

Это возможно с ON CONFLICT clause for INSERT:

Необязательного ON п КОНФЛИКТА определяет альтернативное действие для воспитывающего уникального нарушения или нарушения ограничения исключения ошибки. Для каждой отдельной строки, предлагаемой для вставки, продолжается либо вставка , либо, если нарушено ограничение или указатель арбитера, указанное в конфликте_target, выполняется альтернативное конфликтное действие. ON CONFLICT DO NOTHING просто избегает вставки строки в качестве своего альтернативного действия .

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

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

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

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

  • Нет связанных вопросов^_^