В PostgreSQL вставка на обновление конфликте (вставка) использовать все исключенные значения


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

INSERT INTO tablename (id, username, password, level, email) 
                VALUES (1, 'John', 'qwerty', 5, 'john@mail.com') 
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, 'john@mail.com')
1 66

1 ответ:

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

это может быть либо ничего не делать, либо предложение do UPDATE, указывающее точные детали действия обновления, которое необходимо выполнить в случае конфликта.

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

INSERT INTO users (id, level)
VALUES (1, 0)
ON CONFLICT (id) DO UPDATE
SET level = users.level + 1;