插入新行时自动填充PostgreSQL中的时间戳字段

but5z9lq  于 2023-11-18  发布在  PostgreSQL
关注(0)|答案(6)|浏览(197)

我希望代码能够在插入新行时自动填充时间戳值,就像我在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
)

字符串

ru9i0ody

ru9i0ody1#

要在插入期间填充列,请使用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
请注意,对列名使用保留字通常不是一个好主意。

p8ekf7hl

p8ekf7hl2#

您需要编写一个插入触发器,如果您希望在记录更改时更改更新触发器,则可能需要编写一个更新触发器。这篇文章很好地解释了这一点:
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();

gv8xihay

gv8xihay3#

更新时间戳,仅当值更改时
基于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';

字符串

yrwegjxp

yrwegjxp4#

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

8fq7wneg

8fq7wneg5#

要在插入新行时自动更新PostgreSQL中的timestamp字段,您可以将current_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
)

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

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$
CREATE TRIGGER prevent_timestamp_changes
  BEFORE UPDATE
  ON users
  FOR EACH ROW
  EXECUTE PROCEDURE stop_change_on_timestamp();

的数据

lymgl2op

lymgl2op6#

对于更新和Liquibase YAML:

databaseChangeLog:
  - changeSet:
      id: CREATE FUNCTION set_now_to_timestamp
      author: Konstantin Chvilyov
      changes:
        - sql:
            sql: CREATE OR REPLACE FUNCTION set_now_to_timestamp() RETURNS TRIGGER LANGUAGE plpgsql AS 'BEGIN NEW.timestamp = NOW(); RETURN NEW; END;'

  - changeSet:
      id: CREATE TRIGGER update_users_set_now_to_timestamp
      author: Konstantin Chvilyov
      changes:
        - sql:
            sql: CREATE TRIGGER update_users_set_now_to_timestamp BEFORE UPDATE ON users FOR EACH ROW EXECUTE PROCEDURE set_now_to_timestamp();

字符串

相关问题