在 PostgreSQL 中更新行时更新时间戳

Posted

技术标签:

【中文标题】在 PostgreSQL 中更新行时更新时间戳【英文标题】:Update timestamp when row is updated in 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 的手册以了解细微差别:MySQL 和 Postgres。 @ErwinBrandstetter 是下面提供的答案仍然是 2018 年自动更新时间戳的最佳实践吗? 【参考方案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 发布一个这样的例子可能会非常有用。如果我管理如何动态指定要更新的列,我会将其写为答案。

以上是关于在 PostgreSQL 中更新行时更新时间戳的主要内容,如果未能解决你的问题,请参考以下文章

时间戳、行版本和日期时间 - 插入或更新行时我需要一个标记

使用 Eloquent 更新行时数据不持久

SQL Server 2008 行插入和更新时间戳

SQL Server RowVersion/时间戳 - 比较

postgresql设置自动更新时间方法

在 SQL 列中找到特定字符串后更新文本