В MySQL мы можем сделать там следующий на любое нарушение ограниченийPostgres UPSERT на каких-либо ограничений
INSERT INTO table {setters} ON DUPLICATE KEY UPDATE {setters}
ли в любом случае сделать это в Postgres?
INSERT INTO table {setters} ON CONFLICT(*) DO UPDATE {setters}
Примечание: * = Любой возможный ключ
Почему это важная особенность?
- Я хочу сделать этот код общим для нескольких таблиц. Таким образом, я не могу указать ключи в соответствии с текущим синтаксисом Postgres 9.5 (кто-то может возразить, я мог бы хранить ключи на всех таблицах и динамически менять клавиши. Прежде всего, это не изящно и есть следующая проблема)
- Хотя приложение работает вживую, во время выполнения могут быть добавлены некоторые новые уникальные ограничения. Таким образом, вы не можете указать это в своем коде во время компиляции
- Другая альтернатива: в вашем приложении вы сначала пытаетесь вставить и когда есть ошибка Duplicate key, вы можете поймать ее и попытаться сделать обновление. Это очень плохо, так как это
- Не атомарной операцией
- Задержка между сервером приложений и двойников сервера БД.
- Массовая вставка не возможно
@a_horse_with_no_name я не согласен. В MySQL 'Если вы укажете ON DUPLICATE KEY UPDATE, и будет вставлена строка, которая приведет к дублированию значения в индексе UNIQUE или PRIMARY KEY,' http://dev.mysql.com/doc/refman/5.7/en/insert -он-duplicate.html. Также здесь приведен пример: http://sqlfiddle.com/#!9/b51de/1, где это работает на ** не первичный ключ ** – Rahul
Есть ли какие-либо обновления по этому вопросу? – cingulata