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

在...创建的问题 Sun, Mar 4, 2012 12:00 AM

我希望代码能够在插入新行时自动更新时间戳,就像我在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
)
    
99
  1. 顺便提一下,您的数据类型timestamp由SQL规范定义为TIMESTAMP WITHOUT TIME ZONE的缩写。这几乎肯定不是你想要的,正如由Postgres专家David E. Wheeler解释的那样。另一种类型,TIMESTAMP WITH TIME ZONE可能是你想要的,使用任何传递的时区偏移信息来调整日期时间 UTC (但实际上不存储类型名称时的时区信息)。
    2014-10-01 21:16:13Z
  2. 再次重新学习之后,我写了一篇详细的博客文章关于使用默认,函数和触发器记录行的创建和修改的日期时间。包括用于Postgres的完整示例SQL和PL /pgSQL代码。
    2014-10-02 22:09:11Z
  3. 醇>
    4个答案                              4 跨度>                         

    要在插入期间填充列,请使用 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所提​​及

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

        
    159
    2017-05-23 12:10:06Z
    1. 请注意Postgres有函数告诉您(1)实际当前时刻的时间,(2)语句开始的时间,以及(3)事务开始的时间。此处显示的示例是当前事务的开始。您可能会或可能不会想要这与其他两种可能性相反。
      2014-10-01 21:06:28Z
    2. 关于避免与保留字冲突的名字的好奖励点。请注意,SQL规范明确承诺永远不会使用尾随下划线作为保留字。所以你可以将timestamp变成timestamp_。更好的是更具描述性的名称,如row_created_
      2014-10-01 21:08:39Z
    3. 上半部分并不是OP所要求的,即使下半部分提到其他答案(这是正确的),但它仍然具有误导性。这不应该被接受为答案。
      2016-09-03 07:44:42Z
    4. 在类型的Postgres文档中说。 Varchar有额外的CPU周期来检查约束,这在TEXT上不会发生。
      2017-06-21 15:50:42Z
    5. 没有一个field,但我从未见过一个有一个字段的有用表格。这个约束因字段数而复杂化。我记得把表中的所有varchar都改成了文本,并且获得了15%的写作改进。此外,小的性能损失不是“NO”性能损失。
      2017-06-21 16:18:40Z
    6. 醇>

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

    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();
    
        
    76
    2017-04-22 00:50:32Z
    1. 这是最好的答案,IMO(虽然默认值足以插入)。
      2016-10-08 12:22:46Z
    2. 这里有什么新东西?
      2018-04-26 02:14:25Z
    3. 2018-05-16 04:37:00Z
    4. 这是一个更完整的解决方案,可用于初始INSERT以及任何后续UPDATE(适用于数据审计)。当然,OP只要求前者。
      2018-06-04 10:37:14Z
    5. unterminated dollar-quoted string at or near "$$ BEGIN
      2018-12-11 13:26:30Z
    6. 醇>

    仅在值更改时更新时间戳

    基于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';
    
        
    43
    2017-05-23 12:34:26Z

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

        
    6
    2015-06-06 19:29:00Z
来源放置 这里