Aggiorna il timestamp quando la riga viene aggiornata in PostgreSQL


87

In MySQL, possiamo eseguirlo dove aggiorna la colonna changetimestampogni volta che la riga viene modificata:

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

C'è qualcosa di simile per fare quanto sopra in PostgreSQL?


afaik non è così facile in PostgreSQL dove è necessario un trigger: pointbeing.net/weblog/2008/03/…
Mechanical_meat

2
Vale la pena notare che MySQL ha una serie di "trattamenti speciali" per le timestampcolonne a seconda della versione e delle impostazioni, che (fortunatamente!) Non possono essere riprodotti in Postgres. Come consentire 0una timestampcolonna o trasformare NULLnel timestamp corrente sull'input in determinate costellazioni. Assicurati di studiare il manuale di entrambi gli RDBMS per essere consapevole delle sottili differenze: MySQL e Postgres .
Erwin Brandstetter

1
@ErwinBrandstetter è la risposta fornita di seguito ancora la migliore pratica per l'aggiornamento automatico dei timestamp nel 2018?
CommonSenseCode

Risposte:


127

Crea una funzione che aggiorni la colonna changetimestamp di una tabella in questo modo:

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

Crea un trigger sulla tabella che richiami la funzione update_changetimestamp_column () ogni volta che si verifica un aggiornamento in questo modo:

    CREATE TRIGGER update_ab_changetimestamp BEFORE UPDATE
    ON ab FOR EACH ROW EXECUTE PROCEDURE 
    update_changetimestamp_column();

2
Quindi, non c'è altro modo per fare quello che voglio se non tramite un trigger? Perché vorrei implementare "all'aggiornamento del timestamp" per tutte le mie tabelle possibilmente 300+. E penso che la creazione di trigger potrebbe causare alcuni problemi di prestazioni.
bichonfrise74

5
Per quanto ne so, questo è il modo standard per farlo in postgresql. Quando scrivi "on update current_timestamp" in mysql, crea un trigger sulla tabella in background. La differenza è che stai scrivendo il trigger qui manualmente invece di averlo scritto per te.
Charles Ma,

3
Non c'è praticamente alcuna penalizzazione delle prestazioni, almeno in qualsiasi database ragionevole.

5
C'è un modo per dare il nome della colonna che deve essere aggiornato come parametro alla funzione update_changetimestamp_column?
Antoan Milkov

7
@womble Sarebbe probabilmente molto utile pubblicare un esempio di questo. Se riesco a specificare dinamicamente quale colonna aggiornare, la scriverò come risposta.
MirroredFate
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.