Postgres (jak prawie wszystkie inne DBMS) nie sprawdzi, czy wartości docelowe różnią się od oryginalnych. Odpowiedź brzmi:tak, zaktualizuje wiersz, nawet jeśli wartości są różne.
Możesz jednak łatwo zapobiec "pustej" aktualizacji w tym przypadku, dołączając klauzulę where:
INSERT INTO topic (......)
VALUES (......)
ON CONFLICT (...)
DO UPDATE
set ... -- update all column
WHERE topic IS DISTINCT FROM excluded;
Klauzula where uniemożliwi aktualizację wiersza, który jest identyczny z tym, który jest wstawiany. Aby to działało poprawnie, Twoja wstawka ma aby wyświetlić wszystkie kolumny tabel docelowych. W przeciwnym razie topic is distinct from excluded
warunek zawsze będzie prawdziwy, ponieważ excluded
wiersz ma mniej kolumn niż topic
wiersz i dlatego jest od niego „odmienny”.
Dodawanie czeku na zmodyfikowane wartości było wielokrotnie omawiane na liście dyskusyjnej i zawsze było odrzucane. Głównym powodem jest to, że nie ma sensu mieć narzutu na sprawdzanie zmian dla każdego oświadczenie tylko po to, aby poradzić sobie z kilkoma źle napisanymi.