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.