Postgres (come quasi tutti gli altri DBMS) non verificherà se i valori target sono diversi da quelli originali. Quindi la risposta è:sì, aggiornerà la riga anche se i valori sono diversi.
Tuttavia, puoi facilmente impedire l'aggiornamento "vuoto" in questo caso includendo una clausola where:
INSERT INTO topic (......)
VALUES (......)
ON CONFLICT (...)
DO UPDATE
set ... -- update all column
WHERE topic IS DISTINCT FROM excluded;
La clausola where impedirà l'aggiornamento di una riga identica a quella che viene inserita. Per farlo funzionare correttamente, il tuo inserto ha per elencare tutti colonne delle tabelle di destinazione. Altrimenti l'topic is distinct from excluded
la condizione sarà sempre vera perché excluded
la riga ha meno colonne rispetto all'topic
riga e quindi è "distinto" da esso.
L'aggiunta di un controllo per i valori modificati è stata discussa più volte nella mailing list ed è sempre stata eliminata. Il motivo principale è che non ha senso avere il sovraccarico di controllare le modifiche per ogni dichiarazione solo per far fronte ad alcune scritte male.