Postgresql更新时的当前时间戳

时间:2010-03-02 11:54:18

标签: mysql postgresql

postgres等效于以下mysql代码

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
);

根据Alex Brasetvik的回答,似乎我应该使用触发器,我的问题是我有一些表t1,t2 ......有创建和修改的字段,是否可以编写一个通用的过程?

- 更新 几乎准备好了

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();

3 个答案:

答案 0 :(得分:17)

确保所有表都具有相同的列名:

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();

答案 1 :(得分:9)

感谢您提供Mithun和Alex Brasetvik的信息。

我想在触发器上添加一个小调整。由于我们很可能希望 modified 列存储上次更改行时的时间戳,而不是当它是UPDATE语句的目标时,我们必须比较行的新值和旧值。只有当这两个值不同时,我们才会更新已修改列。

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;
$$;

此触发器确保仅在UPDATE操作实际更改存储在行中的值时才更新已修改的列。

答案 2 :(得分:4)

使用触发器更新它。 Documentation and examples