Quando você está upserting uma linha (PostgreSQL> = 9.5) e deseja que o INSERT possível seja exatamente o mesmo que o UPDATE possível, você pode escrevê-lo assim:
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
Existe um caminho mais curto? Para dizer apenas: use todos os valores EXCLUDE.
No SQLite, eu costumava fazer:
INSERT OR REPLACE INTO tablename (id, user, password, level, email)
VALUES (1, 'John', 'qwerty', 5, '[email protected]')
postgresql
upsert
postgresql-9.5
Sebastian
fonte
fonte
INSERT INTO tablename (id, username, password, level, email) VALUES (1, 'John', 'qwerty', 5, '[email protected]') ON CONFLICT (id) DO UPDATE SET (username, password, level, email) = (EXCLUDED.username, EXCLUDED.password, EXCLUDED.level, EXCLUDED.email).
Quase a mesma, mas fácil de copiar / colar / gerenciar a lista de colunasRespostas:
O Postgres não implementou um equivalente a
INSERT OR REPLACE
. DosON CONFLICT
documentos (ênfase minha):Embora não seja um atalho para substituição,
ON CONFLICT DO UPDATE
aplica-se de maneira mais geral, pois permite definir novos valores com base em dados preexistentes. Por exemplo:fonte