Actualizar la marca de tiempo cuando la fila se actualiza en PostgreSQL

85

En MySQL, podemos ejecutar esto donde actualiza la columna changetimestampcada vez que se cambia la fila:

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

¿Hay algo similar a hacer lo anterior en PostgreSQL?

bichonfrise74
fuente
que yo sepa no es tan fácil en PostgreSQL donde se necesita un disparador: pointbeing.net/weblog/2008/03/...
mechanical_meat
2
Vale la pena señalar que MySQL tiene una serie de "tratamientos especiales" para las timestampcolumnas según la versión y la configuración, que (¡afortunadamente!) No se pueden reproducir en Postgres. Como permitir 0una timestampcolumna o transformarse NULLen la marca de tiempo actual en la entrada en ciertas constelaciones. Asegúrese de estudiar el manual de ambos RDBMS para estar al tanto de las sutiles diferencias: MySQL y Postgres .
Erwin Brandstetter
1
@ErwinBrandstetter, ¿la respuesta proporcionada a continuación sigue siendo la mejor práctica para la actualización automática de marcas de tiempo en 2018?
CommonSenseCode

Respuestas:

124

Cree una función que actualice la columna changetimestamp de una tabla así:

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

Cree un desencadenador en la tabla que llame a la función update_changetimestamp_column () siempre que se produzca una actualización así:

    CREATE TRIGGER update_ab_changetimestamp BEFORE UPDATE
    ON ab FOR EACH ROW EXECUTE PROCEDURE 
    update_changetimestamp_column();
Charles Ma
fuente
2
Entonces, ¿no hay otra forma de hacer lo que quiero excepto a través de un disparador? Porque me gustaría implementar 'en la marca de tiempo de actualización' para todas mis tablas, posiblemente 300+. Y creo que la creación de desencadenantes puede causar algunos problemas de rendimiento.
bichonfrise74
5
Hasta donde yo sé, esta es la forma estándar de hacer esto en postgresql. Cuando escribe "on update current_timestamp" en mysql, crea un disparador en la tabla en segundo plano. La diferencia es que está escribiendo el disparador aquí manualmente en lugar de hacerlo por usted.
Charles Ma
3
Prácticamente no hay penalización de rendimiento, al menos en cualquier base de datos sensible.
5
¿Hay alguna forma de dar el nombre de la columna que debe actualizarse como parámetro de la función update_changetimestamp_column?
Antoan Milkov
7
@womble Probablemente sería muy útil publicar un ejemplo de esto. Si logro especificar dinámicamente qué columna actualizar, la escribiré como respuesta.
MirroredFate