Aktualisieren Sie den Zeitstempel, wenn die Zeile in PostgreSQL aktualisiert wird

85

In MySQL können wir dies ausführen, wobei die Spalte changetimestampjedes Mal aktualisiert wird, wenn die Zeile geändert wird:

create table ab (
  id int, 
  changetimestamp timestamp 
    NOT NULL 
    default CURRENT_TIMESTAMP 
    on update CURRENT_TIMESTAMP 
);

Gibt es etwas Ähnliches in PostgreSQL?

bichonfrise74
quelle
afaik nicht so einfach , in PostgreSQL , wo Sie brauchen einen Trigger: pointbeing.net/weblog/2008/03/...
mechanical_meat
2
Es ist erwähnenswert, dass MySQL timestampje nach Version und Einstellungen eine Reihe von "Spezialbehandlungen" für Spalten bietet, die (zum Glück!) Nicht in Postgres reproduziert werden können. 0Zum Beispiel das Zulassen einer timestampSpalte oder das Umwandeln NULLin den aktuellen Zeitstempel bei der Eingabe in bestimmten Konstellationen. Lesen Sie unbedingt das Handbuch beider RDBMS, um sich der subtilen Unterschiede bewusst zu werden: MySQL und Postgres .
Erwin Brandstetter
1
@ErwinBrandstetter ist die unten angegebene Antwort immer noch die beste Vorgehensweise für die automatische Anpassung von Zeitstempeln für 2018?
CommonSenseCode

Antworten:

125

Erstellen Sie eine Funktion, die die Änderungsstempelspalte einer Tabelle wie folgt aktualisiert:

CREATE OR REPLACE FUNCTION update_changetimestamp_column()
RETURNS TRIGGER AS $$
BEGIN
   NEW.changetimestamp = now(); 
   RETURN NEW;
END;
$$ language 'plpgsql';

Erstellen Sie einen Trigger für die Tabelle, der die Funktion update_changetimestamp_column () aufruft, wenn eine Aktualisierung wie folgt erfolgt:

    CREATE TRIGGER update_ab_changetimestamp BEFORE UPDATE
    ON ab FOR EACH ROW EXECUTE PROCEDURE 
    update_changetimestamp_column();
Charles Ma
quelle
2
Es gibt also keine andere Möglichkeit, das zu tun, was ich will, als über einen Auslöser? Weil ich 'on update timestamp' für alle meine Tabellen implementieren möchte, möglicherweise 300+. Und ich denke, dass das Erstellen von Triggern einige Leistungsprobleme verursachen kann.
Bichonfrise74
5
Soweit ich weiß, ist dies die Standardmethode in postgresql. Wenn Sie "on update current_timestamp" in MySQL schreiben, wird ein Trigger für die Tabelle im Hintergrund erstellt. Der Unterschied besteht darin, dass Sie den Trigger hier manuell schreiben, anstatt ihn für Sie schreiben zu lassen.
Charles Ma
3
Es gibt praktisch keine Leistungseinbußen - zumindest in jeder vernünftigen Datenbank.
5
Gibt es eine Möglichkeit, den Spaltennamen, der aktualisiert werden muss, als Parameter für die Funktion update_changetimestamp_columnanzugeben?
Antoan Milkov
7
@womble Es wäre wahrscheinlich sehr nützlich, ein Beispiel dafür zu posten. Wenn ich es schaffe, dynamisch anzugeben, welche Spalte aktualisiert werden soll, schreibe ich sie als Antwort.
MirroredFate