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