Postgresql - 更新规则 - 可能有最后修改日期,自动更新该行的“更新”?

时间:2012-01-05 10:16:55

标签: postgresql

我希望有一个“lastmodified”时间戳(或者datetime?不确定它是否与数据的显示有所不同)来记录该记录的最后修改日期/时间。

显然这可以使用触发器。由于我之前没有使用过触发器,我想我可以先尝试一下“更新规则”,因为这对我来说也是新的:

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

正如您所看到的,我只想更新THAT customer_sessionid的最后修改条目,所以我不确定如何引用它。 UPDATE查询将如下所示:

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

非常感谢!

2 个答案:

答案 0 :(得分:28)

您不能使用规则,因为它会创建无限递归。正确的方法是在触发之前创建一个,就像 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();

答案 1 :(得分:6)

您可以编写一个触发器来触发BEFORE UPDATE以修改该日期。

参见例39-4,它在UPDATE:

之前添加用户名和时间戳

http://www.postgresql.org/docs/current/static/plpgsql-trigger.html