2016-03-04 4 views
4

В 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, вы можете поймать ее и попытаться сделать обновление. Это очень плохо, так как это
    1. Не атомарной операцией
    2. Задержка между сервером приложений и двойников сервера БД.
    3. Массовая вставка не возможно
+0

@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

+0

Есть ли какие-либо обновления по этому вопросу? – cingulata

ответ

1

Конечно. PostgreSQL 9.5+ позволяет сделать это, таким образом:

MySQL запрос:

INSERT INTO tablename (a,b,c) VALUES (1,2,3) 
    ON DUPLICATE KEY UPDATE c=c+1; 

В PostgreSQL становится:

INSERT INTO tablename (a, b, c) values (1, 2, 10) 
ON CONFLICT (a) DO UPDATE SET c = tablename.c + 1; 
+0

Давайте скажем, что все a, b, c должны быть уникальными, и я хочу заставить его работать над любым нарушением ограничения. Как мне это сделать? – Rahul

+1

Каково фактическое определение таблицы? УНИКАЛЬНО (a, b, c) или УНИКАЛЬНЫЙ (a), УНИКАЛЬНЫЙ (b), УНИКАЛЬНЫЙ (c)? –

+0

@ Рахул Не уверен, получу ли вы то, что вы имеете в виду. Если есть только три столбца, и если вы хотите, чтобы все три (в совокупности, я полагаю) были уникальными, конфликт PK никогда не нуждался бы в UPDATE. И сомневайтесь, можете ли вы работать над «любым конфликтом». Позволяет ли MySQL это делать? –

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

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