PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Würde Postgres die Auslagerungsdatei wirklich aktualisieren, wenn alle Felder vor und nach der Aktualisierung gleich sind?

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.