Подтвердить что ты не робот

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

Есть ли более короткий путь? Чтобы просто сказать: используйте все значения EXCLUDE.

В SQLite я использовал:

INSERT OR REPLACE INTO tablename (id, user, password, level, email) 
                        VALUES (1, 'John', 'qwerty', 5, '[email protected]')
4b9b3361

Ответ 1

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

Это может быть либо НИЧЕГО, либо предложение 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;