Wie kann ich einen Trigger einchecken, wenn die gesamte Zeile nach einem Update gleich bleibt?

10

Natürlich könnte ich es für jede Spalte tun, die so vergleicht:

if (old.column1 = new.column1 and old.column2 = new.column2...)

Aber es wäre hart codiert und schwer zu pflegen, wenn ich zum Beispiel in Zukunft eine weitere Spalte hinzufügen würde.

Gibt es eine Möglichkeit zu überprüfen, ob alle Spalten gleich bleiben, ohne jede einzelne Spalte manuell zu überprüfen?

Mateus Viccari
quelle
Können Sie EXCEPT - techonthenet.com/postgresql/except.php
Scott Hodgin
Entschuldigung, aber wie würde EXCEPT in meinem Fall verwendet werden? Ich versuche, die alte Zeile mit den neuen Zeilenwerten zu vergleichen. Soweit ich weiß, wird sie verwendet, um vorhandene Zeilen aus zwei Abfragen zu vergleichen, nicht im alten / neuen Kontext eines Triggers ...
Mateus Viccari
Ich kenne Ihre Datenbank nicht - gibt es eine Möglichkeit, neue auszuwählen. * Außer alte auswählen. *? Wenn die Anzahl der Zeilen = 0 ist, haben sich keine Zeilen geändert
Scott Hodgin

Antworten:

15

Sie können einfach die oldund die newDatensätze vergleichen, mit is not distinct fromdenen NULL-Werte korrekt behandelt werden (wenn alle Spalten als NOT NULL definiert sind, können Sie einfach =oder verwenden <>).

if old is not distinct from new then 
   .... do something
end if;

Auf die gleiche Weise kann überprüft werden, ob mindestens eine Spalte geändert wurde:

if old is distinct from new then 
   .... do something
end if;
ein Pferd ohne Name
quelle
Wie werden NULL-Werte von diesen Bedingungen behandelt?
Ypercubeᵀᴹ
@ ypercubeᵀᴹ: guter Punkt. Ich habe meine Antwort aktualisiert.
a_horse_with_no_name
Danke. Ich habe eine kurze Überprüfung durchgeführt und es scheint, dass old=newder Fall genau so behandelt wird old is not distinct from old. Mit anderen Worten, ich konnte keinen Fall finden, in old=newdem ein NULL-Ergebnis erzielt wird . Das habe ich nicht erwartet!
Ypercubeᵀᴹ
Ich denke, der Unterschied wäre mit, old <> newaber ich bin nicht ganz sicher.
a_horse_with_no_name