Postgresql更新时的当前时间戳

Mit*_*ran 19 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
);
Run Code Online (Sandbox Code Playgroud)

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

--update几乎准备好了

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();
Run Code Online (Sandbox Code Playgroud)

Fra*_*ens 18

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

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();
Run Code Online (Sandbox Code Playgroud)


小智 9

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

我想在触发器上添加一个小调整.由于我们很可能希望修改的列在上次更改行时存储时间戳,而不是在它是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;
$$;
Run Code Online (Sandbox Code Playgroud)

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


Ale*_*vik 5

使用触发器更新它。文档和示例