2009-06-24 7 views
53

En MySQL, podemos ejecutar este donde se actualiza la columna changetimestamp cada vez que se cambia la fila:actualización de marca de tiempo cuando la fila se actualiza en PostgreSQL

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

¿Hay algo parecido a hacer lo anterior en PostgreSQL?

+0

afaik no es tan fácil en PostgreSQL donde necesita un disparador: http://www.pointbeing.net/weblog/2008/03/mysql-versus-postgresql-adding-a-last-colified-column-to-a-table .html – bernie

+2

Vale la pena señalar que MySQL tiene una serie de "tratamientos especiales" para 'timestam p' columnas según la versión y la configuración, que (¡afortunadamente!) no se pueden reproducir en Postgres. Me gusta permitir '0' para una columna' timestamp' o transformar 'NULL' en la marca de tiempo actual a la entrada en ciertas constelaciones. Asegúrese de estudiar el manual de ambos RDBMS para estar al tanto de las diferencias sutiles: [MySQL] (http://dev.mysql.com/doc/refman/5.6/en/timestamp-initialization.html) y [Postgres] (http : //www.postgresql.org/docs/current/interactive/datatype-datetime.html). –

Respuesta

88

Crear una función que actualiza la columna changetimestamp de una tabla de este modo:

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

crear un disparador en la tabla que llama a la función update_changetimestamp_column() cada vez que se produce una actualización de este modo:

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

Entonces, ¿no hay otra manera de hacer lo que quiero, excepto a través de un gatillo? Porque me gustaría implementar 'en la marca de tiempo de actualización' para todas mis tablas posiblemente 300+. Y estoy pensando que la creación de desencadenantes podría causar algunos problemas de rendimiento. – bichonfrise74

+3

Hasta donde yo sé, esta es la forma estándar de hacer esto en postgresql. Cuando escribe "en la actualización current_timestamp" en mysql, crea un disparador en la tabla en el fondo. La diferencia es que está escribiendo el desencadenador aquí manualmente en lugar de tenerlo escrito para usted. –

+3

Prácticamente no hay ninguna penalización en el rendimiento, al menos en cualquier base de datos sensata. –

Cuestiones relacionadas