2010-03-02 145 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操作實際更改存儲在行中的值時,才更新修改的列。