如何自动更新PostgreSQL中的时间戳

时间:2012-03-04 16:08:15

标签: database postgresql

我希望代码能够在插入新行时自动更新时间戳,就像我在MySQL中使用CURRENT_TIMESTAMP一样。

我如何在PostgreSQL中实现这一目标?

CREATE TABLE users (
    id serial not null,
    firstname varchar(100),
    middlename varchar(100),
    lastname varchar(100),
    email varchar(200),
    timestamp timestamp
)

4 个答案:

答案 0 :(得分:152)

要在插入期间填充列,请使用DEFAULT值:

CREATE TABLE users (
  id serial not null,
  firstname varchar(100),
  middlename varchar(100),
  lastname varchar(100),
  email varchar(200),
  timestamp timestamp default current_timestamp
)

请注意,可以通过在INSERT语句中提供值来明确覆盖该列的值。如果你想要防止你需要trigger

如果您需要在更新行时更新该列,则还需要一个触发器(mentioned by E.J. Brennan

请注意,对列名使用保留字通常不是一个好主意。您应该找到与timestamp

不同的名称

答案 1 :(得分:72)

您需要编写插入触发器,如果​​您希望在更改记录时更改它,则可能需要更新触发器。这篇文章解释得非常好:

http://www.revsys.com/blog/2006/aug/04/automatically-updating-a-timestamp-column-in-postgresql/

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

像这样应用触发器:

CREATE TRIGGER update_customer_modtime BEFORE UPDATE ON customer FOR EACH ROW EXECUTE PROCEDURE  update_modified_column();

答案 2 :(得分:41)

仅在值更改时更新时间戳

基于E.J的链接并从此链接添加if语句(https://stackoverflow.com/a/3084254/1526023

CREATE OR REPLACE FUNCTION update_modified_column()
RETURNS TRIGGER AS $$
BEGIN
   IF row(NEW.*) IS DISTINCT FROM row(OLD.*) THEN
      NEW.modified = now(); 
      RETURN NEW;
   ELSE
      RETURN OLD;
   END IF;
END;
$$ language 'plpgsql';

答案 3 :(得分:6)

使用' now()'默认值会自动生成时间戳。