Когда вы добавляете строку (PostgreSQL> = 9.5) и хотите, чтобы возможный INSERT был точно таким же, как и возможное UPDATE, вы можете написать его так:
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')
postgresql
upsert
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 (username, password, level, email) = (EXCLUDED.username, EXCLUDED.password, EXCLUDED.level, EXCLUDED.email).
почти такая же, но простая в копировании / вставке / управлении списком столбцовОтветы:
Postgres не реализовал эквивалент
INSERT OR REPLACE
. ИзON CONFLICT
документов (выделение мое):Хотя это не дает вам сокращения для замены, оно
ON CONFLICT DO UPDATE
применяется в более общем плане, поскольку позволяет устанавливать новые значения на основе ранее существующих данных. Например:источник