PostgreSQL INSERT ON CONFLICT UPDATE (upsert) использовать все исключенные значения

Когда вы добавляете строку (PostgreSQL> = 9.5) и хотите, чтобы возможный INSERT был точно таким же, как и возможный UPDATE, вы можете написать его так:

INSERT INTO tablename (id, username, password, level, email) 
                VALUES (1, 'John', 'qwerty', 5, '[email protected]') 
ON CONFLICT (id) DO UPDATE SET 
  id=EXCLUDED.id, username=EXCLUDED.username,
  password=EXCLUDED.password, level=EXCLUDED.level,email=EXCLUDED.email

Есть ли более короткий путь? Проще говоря: используйте все значения ИСКЛЮЧЕНИЯ.

В SQLite я раньше делал:

INSERT OR REPLACE INTO tablename (id, user, password, level, email) 
                        VALUES (1, 'John', 'qwerty', 5, '[email protected]')
74 голоса | спросил Sebastian 1 PMpFri, 01 Apr 2016 17:52:08 +030052Friday 2016, 17:52:08

1 ответ


0

Postgres не реализовал эквивалент INSERT OR REPLACE. Из ON CONFLICT документы (выделено мной):

  

Это может быть либо DO NOTHING, либо предложение DO UPDATE, в котором указываются точные данные действия UPDATE, которое должно быть выполнено в случае конфликта.

Хотя это и не дает вам сокращения для замены, ON CONFLICT DO UPDATE применяется более широко, поскольку позволяет устанавливать новые значения на основе ранее существовавших данные. Например:

INSERT INTO users (id, level)
VALUES (1, 0)
ON CONFLICT (id) DO UPDATE
SET level = users.level + 1;
ответил Kristján 1 PMpFri, 01 Apr 2016 18:29:42 +030029Friday 2016, 18:29:42

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132