在 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 中更新行时更新时间戳的主要内容,如果未能解决你的问题,请参考以下文章