Postgres (como casi todos los demás DBMS) no verificará si los valores objetivo son diferentes a los originales. Entonces la respuesta es:sí, actualizará la fila incluso si los valores son diferentes.
Sin embargo, puede evitar fácilmente la actualización "vacía" en este caso al incluir una cláusula where:
INSERT INTO topic (......)
VALUES (......)
ON CONFLICT (...)
DO UPDATE
set ... -- update all column
WHERE topic IS DISTINCT FROM excluded;
La cláusula where evitará la actualización de una fila que sea idéntica a la que se está insertando. Para que funcione correctamente, su inserción tiene para listar todos columnas de las tablas de destino. De lo contrario, el topic is distinct from excluded
la condición siempre será verdadera porque el excluded
la fila tiene menos columnas que el topic
fila y, por lo tanto, se identifica como "distinta" de ella.
La adición de un cheque para valores modificados se ha discutido varias veces en la lista de correo y siempre se ha descartado. La razón principal es que no tiene sentido tener la sobrecarga de verificar los cambios para cada declaración solo para hacer frente a algunas mal escritas.