我希望有一个“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}
非常感谢!
答案 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