excluded - postgresql insert or update if exists
PostgreSQL INSERT ON CONFLICT UPDATE(upsert) usa todos los valores excluidos (1)
Postgres no ha implementado un equivalente a
INSERT OR REPLACE
.
De los
documentos
ON CONFLICT
(énfasis mío):
Puede ser NO HACER NADA o una cláusula DO UPDATE que especifique los detalles exactos de la acción UPDATE que se realizará en caso de conflicto.
Aunque no le da una abreviatura para el reemplazo,
ON CONFLICT DO UPDATE
aplica de manera más general, ya que le permite establecer nuevos valores basados en datos preexistentes.
Por ejemplo:
INSERT INTO users (id, level)
VALUES (1, 0)
ON CONFLICT (id) DO UPDATE
SET level = users.level + 1;
Cuando está insertando una fila (PostgreSQL> = 9.5), y desea que el posible INSERT sea exactamente igual a la posible ACTUALIZACIÓN, puede escribirlo así:
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
¿Hay un camino más corto? Solo para decir: use todos los valores EXCLUDE.
En SQLite solía hacer:
INSERT OR REPLACE INTO tablename (id, user, password, level, email)
VALUES (1, ''John'', ''qwerty'', 5, ''[email protected]'')