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

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

我将如何在PostgreSQL中实现这个function?

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

要在插入期间填充列,请使用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语句中提供一个值,可以明确地覆盖该列的值。 如果你想防止你需要一个触发器 。

如果需要在行更新时更新该列,则还需要触发器(如EJ Brennan所述 )

请注意,为列名使用保留字通常不是一个好主意。 您应该find与timestamp不同的名称

您需要编写一个插入触发器,并且如果您希望在更改logging时更改触发器,则可能会有更新触发器。 这篇文章很好地解释了这一点:

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(); 

更新时间戳,只有当值更改时

基于EJ的链接,并添加一个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'; 

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