Mi caso de uso implica sincronizar una tabla con una fuente ascendente en un horario recurrente.
Cada fila tiene un identificador único y otras columnas, y quiero asegurarme de que estoy insertando filas ascendentes nuevas y actualizando las filas ascendentes modificadas. Y podría haber miles de filas para sincronizar.
Pero me gustaría evitar actualizaciones innecesarias donde la fila en la base de datos no difiere de lo que está aguas arriba.
Actualmente estoy usando ON CONFLICT UPDATE así:
INSERT INTO symbols (id, name, status) VALUES (1, 'one', 'online'), (2, 'two', 'offline'), ... ON CONFLICT (id) UPDATE SET (id, name, status) = (excluded.id, excluded.name, excluded.status) RETURNING * Pero esto escribirá las actualizaciones incluso cuando nada cambie. ¿Cómo debo modificar la UPDATE para verificar y aplicar de manera eficaz a las filas que lo necesitan?
Puede agregar una cláusula where para actualizar solo aquellas filas que son diferentes.
INSERT INTO symbols (id, name, status) VALUES (1, 'one', 'online'), (2, 'two', 'offline'), ... ON CONFLICT (id) DO UPDATE SET (id, name, status) = (excluded.id, excluded.name, excluded.status) WHERE (symbols.id, symbols.name, symbols.status) IS DISTINCT FROM (excluded.id, excluded.name, excluded.status) RETURNING *Sin embargo, esto solo devolverá las filas que realmente están actualizadas, lo que puede afectar la forma en que usa la cláusula de devolución.