我想要一个"lastmodified"时间戳(或者datetime?不确定除了数据的显示之外,它是否会产生差异)来记录该记录条目的最后修改日期/时间.

显然,这是可能的使用触发器.因为我以前没有使用过触发器,所以我想我可以先try 一下"更新规则",因为这对我来说也是新的:

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.
     */

然后我可以创建一个这样的规则.我不确定语法,也不确定是使用新的还是旧的.有人能告诉我正确的语法吗?

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}

非常感谢!

推荐答案

你不能用规则来做,因为它会创建一个无限递归.正确的方法是创建一个before trigger,就像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();

Postgresql相关问答推荐

将XML解析从T-SQL迁移到Postgres时出现问题

在插入时创建一个触发器,在PostgreSQL中的另一个表上创建另一个触发器

INSERT 语句返回策略违规(USING 表达式)

包含间隔在 jooq 和 postgres 中没有按预期工作

使用间隔参数的 go postgres 准备好的语句不起作用

我可以在 Ruby on Rails 上编写 PostgreSQL 函数吗?

PostgreSQL 返回准确或最接近查询日期的日期

升级到 OSX Mavericks 后修复 postgresql

在 Postgresql 中获取星期几

带有 postgres 的 DOCKER 容器,警告:could not open statistics file "pg_stat_tmp/global.stat": Operation not permitted

什么是 postgres 超级用户

Docker - Postgres 和 pgAdmin 4:Connection refused

如何在 postgres json 列中查询嵌套数组?

从time without time zone和时区名称中获取time with time zone

使用 pg-promise 插入多条记录

错误:ERROR: table name specified more than once

如何在 postgresql 交叉表中用零替换空值

PostgreSQL 无法启动:server.key具有组或世界访问权限

如何从我的 postgresql 查询中获取最小值、中值和最大值?

JOIN (SELECT ... ) ue ON 1=1?