Postgres (wie fast alle anderen DBMS) überprüft nicht, ob die Zielwerte von den ursprünglichen abweichen. Die Antwort lautet also:Ja, die Zeile wird aktualisiert, auch wenn die Werte unterschiedlich sind.
Sie können das "leere" Update in diesem Fall jedoch leicht verhindern, indem Sie eine where-Klausel einfügen:
INSERT INTO topic (......)
VALUES (......)
ON CONFLICT (...)
DO UPDATE
set ... -- update all column
WHERE topic IS DISTINCT FROM excluded;
Die where-Klausel verhindert, dass eine Zeile aktualisiert wird, die mit der eingefügten identisch ist. Damit das richtig funktioniert, hat Ihr Einsatz um alle aufzulisten Spalten der Zieltabellen. Andernfalls unterscheidet sich das topic is distinct from excluded
Bedingung wird immer wahr sein, weil der excluded
Zeile hat weniger Spalten als das topic
Zeile und somit "unterscheidbar" von ihr.
Das Hinzufügen einer Überprüfung auf geänderte Werte wurde auf der Mailingliste mehrfach diskutiert und immer wieder verworfen. Der Hauptgrund dafür ist, dass es keinen Sinn macht, für jeden nach Änderungen zu suchen Anweisung, nur um mit ein paar schlecht geschriebenen fertig zu werden.