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


85

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

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

在PostgreSQL中有类似的事情吗?


据我所知不是那么容易,在PostgreSQL中,你需要一个触发: pointbeing.net/weblog/2008/03/...
mechanical_meat

2
值得注意的是,MySQLtimestamp根据版本和设置对列提供了许多“特殊处理” ,(很遗憾!)在Postgres中无法复制。就像在特定星座中输入时允许0输入一timestamp列或转换NULL为当前时间戳一样。一定要研究两个RDBMS的手册,以了解细微的差异:MySQLPostgres
Erwin Brandstetter

1
@ErwinBrandstetter是下面提供的答案仍然是在2018年自动更新时间戳的最佳实践吗?
CommonSenseCode

Answers:


124

创建一个函数来更新表的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();

2
因此,除了通过触发器之外,没有其他方法可以完成我想做的事情?因为我想为所有表(可能超过300个)实现“更新时间戳”。我认为创建触发器可能会导致一些性能问题。
bichonfrise74,2009年

5
据我所知,这是在postgresql中执行此操作的标准方法。当您在mysql中编写“ on update current_timestamp”时,它将在后台的表上创建一个触发器。不同之处在于,您是在此处手动编写触发器,而不是为您编写触发器。
马骏

3
几乎没有性能损失-至少在任何明智的数据库中。

5
有没有一种方法可以将需要更新的列名作为参数提供给函数update_changetimestamp_column
Antoan Milkov

7
@womble发布一个示例可能非常有用。如果我设法动态指定要更新的列,则将其写为答案。
MirroredFate 2016年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.