mysql - type - Postgresql timestamp actual en la actualización
sintaxis datetime mysql (3)
¿Cuál es el equivalente de postgres del código mysql a continuación?
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 la respuesta de Alex Brasetvik a continuación, parece que debo ir con los desencadenantes, mi problema es que tengo varias 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();
Actualízalo con un disparador. Documentación y ejemplos .
Gracias por la información Mithun y Alex Brasetvik.
Me gustaría añadir un pequeño pellizco al gatillo. Como es probable que queramos que la columna modificada almacene la marca de tiempo cuando se modificó por última vez la fila, no cuando fue el objetivo de una instrucción UPDATE, tenemos que comparar el valor nuevo y el valor antiguo de la fila. Actualizamos la columna modificada solo si estos dos valores difieren.
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 activador garantiza que la columna modificada se actualice solo si la operación ACTUALIZACIÓN cambia realmente los valores almacenados en la fila.
Solo asegúrate de que todas las tablas tengan el mismo nombre de columna:
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();