2010-03-02 142 views
18

什么是Postgres的相当于下面的MySQL代码PostgreSQL的当前时间戳

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

按如下亚历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(); 

回答

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

谢谢,你做到了! – 2010-03-02 13:02:52

4

与触发器进行更新。 Documentation and examples

+0

谢谢亚历克斯,你是绝对正确的,我已经更新了我的问题,请亲切地看到, – 2010-03-02 12:08:27

8

谢谢你的信息,大额牛和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; 
$$; 

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