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

Aar*_*ron 103 database postgresql

我希望代码能够在插入新行时自动更新时间戳,因为我可以使用CURRENT_TIMESTAMP在MySQL中执行此操作.

我怎样才能在PostgreSQL中实现这一目标?

CREATE TABLE users (
    id serial not null,
    firstname varchar(100),
    middlename varchar(100),
    lastname varchar(100),
    email varchar(200),
    timestamp timestamp
)
Run Code Online (Sandbox Code Playgroud)

a_h*_*ame 165

要在插入期间填充列,请使用以下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
)
Run Code Online (Sandbox Code Playgroud)

请注意,可以通过在INSERT语句中提供值来显式覆盖该列的值.如果你想防止你需要一个触发器.

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

请注意,对列名使用保留字通常不是一个好主意.你应该找到一个不同的名字timestamp

  • 要知道,Postgres有[功能](http://www.postgresql.org/docs/current/static/functions-datetime.html)告诉你(1)实际的当前时刻的时间,(2)时间声明开始,以及(3)交易开始的时间.此处显示的示例是当前事务的开始.您可能会或可能不想要这与其他两种可能性相反. (9认同)
  • 不是一个字段,但我从来没有见过一个有一个字段的有用表.这个约束因字段数而复杂化.我记得把表中的所有varchar都改成了文本,并且获得了15%的写作改进.此外,小的性能损失不是"NO"性能损失. (3认同)
  • 关于避免与保留字冲突的名字的好处.请注意,SQL规范明确承诺永远不会使用尾随下划线作为保留字.所以你可以把`timestamp`变成'timestamp_`.更好的是一个更具描述性的名称,如`row_created_`. (2认同)
  • 在类型的 Postgres 文档中是这么说的。Varchar 有额外的 CPU 周期来检查约束,这不会发生在 TEXT 上。 (2认同)

E.J*_*nan 82

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

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';
Run Code Online (Sandbox Code Playgroud)

像这样应用触发器:

CREATE TRIGGER update_customer_modtime BEFORE UPDATE ON customer FOR EACH ROW EXECUTE PROCEDURE  update_modified_column();
Run Code Online (Sandbox Code Playgroud)

  • 这里有什么新消息? (2认同)

小智 46

仅在值更改时更新时间戳

基于EJ的链接并从此链接添加if语句(/sf/answers/215897811/)

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';
Run Code Online (Sandbox Code Playgroud)


Ash*_*mar 7

要在插入新行时自动更新 PostgresSQL 中的时间戳字段,您可以设置 为其current_timestampdefault

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

除此之外,您可能希望阻止任何人将来更新此字段,这可以通过创建更新触发器并应用它来完成:

CREATE OR REPLACE FUNCTION stop_change_on_timestamp()
  RETURNS trigger AS
$BODY$
BEGIN
  -- always reset the timestamp to the old value ("actual creation time")
  NEW.timestamp := OLD.timestamp;
  RETURN NEW;
END;
$BODY$
Run Code Online (Sandbox Code Playgroud)
CREATE TRIGGER prevent_timestamp_changes
  BEFORE UPDATE
  ON users
  FOR EACH ROW
  EXECUTE PROCEDURE stop_change_on_timestamp();
Run Code Online (Sandbox Code Playgroud)


小智 6

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

  • 仅用于添加值,更新记录时似乎不使用默认值。 (4认同)