我希望代码能够在插入新行时自动更新时间戳,就像我在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
)
答案 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()'默认值会自动生成时间戳。