2012-03-04 23 views
68

Quiero que el código pueda actualizar automáticamente la marca de tiempo cuando se inserta una nueva fila como lo puedo hacer en MySQL usando CURRENT_TIMESTAMP.Cómo actualizo automáticamente una marca de tiempo en PostgreSQL

¿Cómo podré lograr esto en PostgreSQL?

CREATE TABLE users (
    id serial not null, 
    firstname varchar(100), 
    middlename varchar(100), 
    lastname varchar(100), 
    email varchar(200), 
    timestamp timestamp 
) 
+2

Por cierto, su tipo de datos de 'timestamp' está definido por la especificación de SQL como una abreviatura de' TIMESTAMP WITH TIME ZONE'. Eso es casi seguro que no es lo que quiere, como [explicado por el experto de Postgres David E. Wheeler] (http://justatheory.com/computers/databases/postgresql/use-timestamptz.html). El otro tipo, 'TIMESTAMP WITH TIME ZONE' es probablemente lo que usted quiere, usando cualquier información de compensación de zona horaria para ajustar la fecha y hora a [UTC] (http://en.wikipedia.org/wiki/Coordinated_Universal_Time) (pero no almacenando realmente la información de la zona horaria a pesar del nombre del tipo). –

+1

Después de volver a aprender esto una vez más, escribí una [publicación de blog detallada] (http://crafted-software.blogspot.com/2014/10/track-date-time-of-row-creation.html) acerca de registrando la fecha y hora de la creación y modificación de una fila usando el predeterminado, la función y el desencadenador. Incluye un ejemplo completo de código SQL y PL/pgSQL para usar en Postgres. –

Respuesta

114

para poblar la columna durante la inserción, utilice un valor DEFAULT:

CREATE TABLE users (
    id serial not null, 
    firstname varchar(100), 
    middlename varchar(100), 
    lastname varchar(100), 
    email varchar(200), 
    timestamp timestamp default current_timestamp 
) 

Tenga en cuenta que el valor de esa columna se puede sobrescribir explícitamente mediante el suministro de un valor en la instrucción INSERT. Si quiere evitar eso, necesita un trigger.

también necesita un disparador si es necesario actualizar esa columna cada vez que se actualiza la fila (como mentioned by E.J. Brennan)

Tenga en cuenta que el uso de palabras reservadas para los nombres de columna no suele ser una buena idea. Usted debe encontrar un nombre diferente que timestamp

+4

Tenga en cuenta que Postgres tiene [funciones] (http://www.postgresql.org/docs/current/static/functions-datetime.html) para decirle (1) la hora del momento actual real, (2) el Hora en que comenzó la declaración, y (3) Hora en que comenzó la transacción. El ejemplo que se muestra aquí es el inicio de la transacción actual. Puede o no desear eso a diferencia de las otras dos posibilidades. –

+2

Buen punto extra sobre evitar nombres que colisionan con palabras reservadas. Tenga en cuenta que la especificación SQL explícitamente promete nunca usar un guión bajo final como palabra reservada. Entonces puedes hacer 'timestamp' en' timestamp_'.Aún mejor sería un nombre más descriptivo como 'row_created_'. –

+0

La primera mitad no es lo que OP pidió en absoluto, a pesar de que la segunda mitad se refería a otra respuesta (que es correcta), pero aún así es engañosa. Esto no debe ser aceptado como respuesta. –

43

Tendrá que escribir un desencadenador de inserción, y posible un disparador de actualización si desea que se cambia cuando se cambia el registro. En este artículo se explica muy bien:

http://www.revsys.com/blog/2006/aug/04/automatically-updating-a-timestamp-column-in-postgresql/

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

Aplicar el gatillo de esta manera:

CREATE TRIGGER update_customer_modtime BEFORE UPDATE ON customer FOR EACH ROW EXECUTE PROCEDURE update_modified_column(); 
+1

Esta es la mejor respuesta, IMO (aunque, un valor predeterminado es suficiente para insertar). –

31

Actualización de fecha y hora, sólo si los valores cambiados

Basado en el enlace del EJ y añadir una sentencia if desde este enlace (https://stackoverflow.com/a/3084254/1526023)

CREATE OR REPLACE FUNCTION update_modified_column() 
RETURNS TRIGGER AS $$ 
BEGIN 
    IF row(NEW.*) IS DISTINCT FROM row(OLD.*) THEN 
     NEW.modified = now(); 
     RETURN NEW; 
    ELSE 
     RETURN OLD; 
    END IF; 
END; 
$$ language 'plpgsql'; 
3

uso de ' now() 'como valor predeterminado genera automáticamente marca de tiempo.

Cuestiones relacionadas