【问题标题】:Update timestamp when row is updated in PostgreSQL在 PostgreSQL 中更新行时更新时间戳
【发布时间】:2010-11-05 09:05:06
【问题描述】:

在 MySQL 中,我们可以在每次更改行时更新列 changetimestamp 时执行此操作:

create table ab (
  id int, 
  changetimestamp timestamp 
    NOT NULL 
    default CURRENT_TIMESTAMP 
    on update CURRENT_TIMESTAMP 
);

在 PostgreSQL 中是否有类似的操作?

【问题讨论】:

  • afaik 在需要触发器的 PostgreSQL 中并不容易:pointbeing.net/weblog/2008/03/…
  • 值得注意的是,MySQL 对 timestamp 列有许多“特殊处理”,具体取决于版本和设置,这些(幸运的是!)不能在 Postgres 中重现。就像允许0 用于timestamp 列或将NULL 转换为某些星座中输入的当前时间戳。请务必阅读这两个 RDBMS 的手册以了解细微差别:MySQLPostgres
  • @ErwinBrandstetter 是下面提供的答案仍然是 2018 年自动更新时间戳的最佳实践吗?

标签: postgresql timestamp


【解决方案1】:

创建一个函数来更新表的 changetimestamp 列,如下所示:

CREATE OR REPLACE FUNCTION update_changetimestamp_column()
RETURNS TRIGGER AS $$
BEGIN
   NEW.changetimestamp = now(); 
   RETURN NEW;
END;
$$ language 'plpgsql';

在表上创建一个触发器,每当发生更新时调用 update_changetimestamp_column() 函数,如下所示:

    CREATE TRIGGER update_ab_changetimestamp BEFORE UPDATE
    ON ab FOR EACH ROW EXECUTE PROCEDURE 
    update_changetimestamp_column();

【讨论】:

  • 那么,除了通过触发器之外,没有其他方法可以做我想做的事吗?因为我想为我的所有表实现“更新时间戳”,可能超过 300 个。而且我认为创建触发器可能会导致一些性能问题。
  • 据我所知,这是在 postgresql 中执行此操作的标准方法。当您在 mysql 中编写“on update current_timestamp”时,它会在后台在表上创建一个触发器。不同之处在于您在此处手动编写触发器,而不是为您编写。
  • 几乎没有性能损失——至少在任何合理的数据库中是这样。
  • 有没有办法将需要更新的列名作为参数提供给函数update_changetimestamp_column
  • @womble 发布一个这样的例子可能会非常有用。如果我管理如何动态指定要更新的列,我会将其写为答案。
猜你喜欢
  • 1970-01-01
  • 2012-03-22
  • 1970-01-01
  • 2018-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-07
  • 2015-11-19
相关资源
最近更新 更多