update excluded postgresql upsert postgresql-9.5

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]'')