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?


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();

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.