PostgreSQL如何设置一个主键列,时间戳自动填充

时间:2015-06-12 12:45:13

标签: timestamp postgresql-9.1

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

我希望有一个带有时间戳字段的表,该字段会自动获取插入时now()的值。时间戳永远不会更新。我假设我需要创建一个触发器来执行此操作。如果有更简单的方法,请告知。

也许,使列具有默认值now,land然后插入而不指定timestamp列,以便它获得默认值?

create table foo(q_i_time timestamp with time zone not null default now(),someval int);

CREATE TABLE
billing=# insert into foo (someval) values (22);
INSERT 0 1
billing=# insert into foo (someval) values (26);
INSERT 0 1
billing=# insert into foo (someval) values (1);
INSERT 0 1
billing=# select * from foo;

           q_i_time            | someval
-------------------------------+---------
 2008-02-25 17:23:03.247619-08 |      22
 2008-02-25 17:23:07.43922-08  |      26
 2008-02-25 17:23:10.111189-08 |       1
(3 rows)

此自动填充的时间戳列是否可以作为主键?

谢谢高级。

1 个答案:

答案 0 :(得分:2)

不需要触发器,因为您没有更新时间戳。只需声明CREATE TABLE demo ( id integer primary key, created_at timestamp not null default current_timestamp ); ,例如

test=>     CREATE TABLE demo (
test(>         id integer primary key,
test(>         created_at timestamp not null default current_timestamp
test(>     );
CREATE TABLE
test=> INSERT INTO demo(id) VALUES(1),(2);
INSERT 0 2
test=> INSERT INTO demo(id) VALUES(3);
INSERT 0 1
test=> SELECT * FROM demo;
 id |         created_at         
----+----------------------------
  1 | 2015-06-13 12:30:55.169221
  2 | 2015-06-13 12:30:55.169221
  3 | 2015-06-13 12:30:57.395104
(3 rows)

示例:

clock_timestamp

请注意,前两个时间戳是相同的,因为它是单个事务。如果您不想这样做,请使用current_timestamp代替test=> INSERT INTO demo(id, created_at) VALUES (4, '2014-01-01 00:00:00'); INSERT 0 1 test=> SELECT * FROM demo WHERE id = 4; id | created_at ----+--------------------- 4 | 2014-01-01 00:00:00 (1 row)

请注意,应用程序仍然可以通过显式指定它来覆盖时间戳:

def all_commas? str
  str.squeeze == ','
end

all_commas? ','    #=> true 
all_commas? ',,,'  #=> true 
all_commas? '3,'   #=> false
all_commas? ' ,,,' #=> false 
all_commas? ',9,,' #=> false 

如果您希望强制该值,或者您希望在更新行时更新,则只需要一个触发器。