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

在PostgreSQL中更新行时更新时间戳,postgresql,timestamp,Postgresql,Timestamp,在MySQL中,我们可以在每次更改行时更新列changetimestamp: create table ab ( id int, changetimestamp timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP ); 在PostgreSQL中是否有类似的操作?创建一个函数来更新表的changetimestamp列,如下所示: CREATE OR REPLAC

在MySQL中,我们可以在每次更改行时更新列
changetimestamp

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

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

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

CREATE OR REPLACE FUNCTION update_changetimestamp_column()
RETURNS TRIGGER AS $$
BEGIN
   NEW.changetimestamp = now(); 
   RETURN NEW;
END;
$$ language 'plpgsql';
在表上创建一个触发器,每当更新发生时,该触发器调用update\u changetimestamp\u column()函数,如下所示:

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

在需要触发器的PostgreSQL中并不容易:值得注意的是,MySQL根据版本和设置对
timestamp
列有许多“特殊处理”,这(幸运的是!)在Postgres中无法复制。例如允许
0
用于
时间戳
列,或者将
NULL
转换为特定星座中输入的当前时间戳。一定要学习这两种关系数据库管理系统的手册,以了解细微的差别:@ErwinBrandstetter下面提供的答案仍然是2018年自动更新时间戳的最佳实践吗?因此,除了通过触发器之外,没有其他方法可以做我想做的事情?因为我想为我的所有表(可能是300+)实现“更新时间戳”。我认为创建触发器可能会导致一些性能问题。据我所知,这是postgresql中的标准方法。当您在mysql中编写“on update current_timestamp”时,它会在后台的表上创建一个触发器。不同之处在于,您在这里手动编写触发器,而不是为您编写触发器。实际上没有性能损失-至少在任何合理的数据库中是这样。是否有一种方法可以将需要更新的列名作为函数
update\u changetimstamp\u column
?@womble的参数提供给函数
update\u changetimstamp\u column
贴一个这样的例子很有用。如果我管理如何动态指定要更新的列,我将把它作为一个答案来写。