Postgres (stejně jako téměř všechny ostatní DBMS) nebude kontrolovat, zda se cílové hodnoty liší od původních. Takže odpověď zní:ano, aktualizuje řádek, i když se hodnoty liší.
V tomto případě však můžete "prázdné" aktualizaci snadno zabránit vložením klauzule where:
INSERT INTO topic (......)
VALUES (......)
ON CONFLICT (...)
DO UPDATE
set ... -- update all column
WHERE topic IS DISTINCT FROM excluded;
Klauzule where zabrání aktualizaci řádku, který je identický s tím, který se vkládá. Aby to správně fungovalo, vaše vložka má vypsat všechny sloupců cílových tabulek. Jinak se topic is distinct from excluded
podmínka bude vždy pravdivá, protože excluded
řádek má méně sloupců než topic
řádek, a proto se od něj "odlišuje".
Přidání kontroly na změněné hodnoty bylo v mailing listu probráno několikrát a vždy bylo zahozeno. Hlavním důvodem je, že nedává smysl mít režii na kontrolu změn pro každý prohlášení jen proto, aby se vyrovnalo s několika špatně napsanými.