2012-01-05 49 views
10

我想有一個「上次修改」的時間戳(或日期時間?不知道它是否有別於數據表示的區別)記錄該記錄的最後修改日期/時間條目。Postgresql - 更新規則 - 可能有最後修改日期,自動更新該行「更新」?

顯然這是可能的使用觸發器。因爲我以前沒有使用觸發器,我想我可以先試的「更新規則」,因爲這是新的我太:

http://www.postgresql.org/docs/8.3/static/rules-update.html

什麼我已經是這個表記錄客戶的會話數據:

CREATE TABLE customer_session (
    customer_sessionid serial PRIMARY KEY, 
    savedsearch_contents text, 
    lastmodified timestamp default now() 
); /* 
    @ lastmodified - should be updated whenever the table is updated for this entry, just for reference. 
    */ 

然後我可以創建一個這樣的規則。我不確定語法,或者是否使用NEW或OLD。任何人都可以建議正確的語法?

CREATE RULE customer_session_lastmodified AS 
ON UPDATE TO customer_session 
DO UPDATE customer_session SET lastmodified = current_timestamp WHERE customer_sessionid = NEW.customer_sessionid 

正如你可以看到我想要只更新customer_sessionid的上次更改的條目,所以我不知道如何引用它。更新查詢會是這樣的:

UPDATE customer_session SET savedsearch_contents = 'abcde' 
WHERE customer_sessionid = {unique customer ID} 

非常感謝!

回答

19

你不能用規則來實現它,因爲它會創建一個無限遞歸。正確的方法是在觸發器之前創建一個,正如提議的duffymo一樣。

CREATE FUNCTION sync_lastmod() RETURNS trigger AS $$ 
BEGIN 
    NEW.lastmodified := NOW(); 

    RETURN NEW; 
END; 
$$ LANGUAGE plpgsql; 

CREATE TRIGGER 
    sync_lastmod 
BEFORE UPDATE ON 
    customer_session 
FOR EACH ROW EXECUTE PROCEDURE 
    sync_lastmod();