2010-03-02 14 views
18

¿Cuál es el postgres equivalente del código de MySQL a continuaciónPostgreSQL actual en Actualizar

CREATE TABLE t1 (
    created TIMESTAMP DEFAULT CURRENT_TIMESTAMP, 
    modified TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 
); 
CREATE TABLE t2 (
    created TIMESTAMP DEFAULT CURRENT_TIMESTAMP, 
    modified TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 
); 

Según Alex Brasetvik respuesta a continuación, parece que debería ir con disparadores, mi problema es que tengo un número de tablas t1 , t2 ... con campos creados y modificados, ¿es posible escribir un procedimiento generalizado?

--update casi listo

CREATE FUNCTION update_timestamp() RETURNS trigger AS $update_timestamp$ 
    BEGIN 
     NEW.modified := current_timestamp; 
     RETURN NEW; 
    END; 
$update_timestamp$ LANGUAGE plpgsql; 

CREATE TRIGGER update_timestamp BEFORE INSERT OR UPDATE ON t1 
    FOR EACH ROW EXECUTE PROCEDURE update_timestamp(); 
CREATE TRIGGER update_timestamp BEFORE INSERT OR UPDATE ON t2 
    FOR EACH ROW EXECUTE PROCEDURE update_timestamp(); 

Respuesta

17

Sólo asegúrese de que todas las tablas tienen el mismo nombrecolumna:

CREATE OR REPLACE FUNCTION upd_timestamp() RETURNS TRIGGER 
LANGUAGE plpgsql 
AS 
$$ 
BEGIN 
    NEW.modified = CURRENT_TIMESTAMP; 
    RETURN NEW; 
END; 
$$; 

CREATE TRIGGER t_name 
    BEFORE UPDATE 
    ON tablename 
    FOR EACH ROW 
    EXECUTE PROCEDURE upd_timestamp(); 
+0

¡Gracias, lo hiciste! –

4

actualizarlo con un disparador. Documentation and examples.

+0

Gracias Alex, tienes toda la razón, he actualizado mi pregunta, amablemente ver que también –

8

Gracias por la información Mithun y Alex Brasetvik.

Me gustaría agregar una pequeña modificación al gatillo. Como lo más probable es que deseemos la columna modificada para almacenar la marca de tiempo cuando se modificó por última vez la fila, no cuando era el objetivo de una instrucción UPDATE, tenemos que comparar el valor nuevo y el antiguo de la fila. Actualizamos la columna modificada solo si estos dos valores son diferentes.

CREATE OR REPLACE FUNCTION update_modified_timestamp() RETURNS TRIGGER 
LANGUAGE plpgsql 
AS 
$$ 
BEGIN 
    IF (NEW != OLD) THEN 
     NEW.modified = CURRENT_TIMESTAMP; 
     RETURN NEW; 
    END IF; 
    RETURN OLD; 
END; 
$$; 

Este disparador asegura que la columna modificada se actualiza únicamente si la operación de actualización realmente cambia los valores almacenados en la fila.

Cuestiones relacionadas