[英]How do I automatically update a timestamp in PostgreSQL
我希望代碼能夠在插入新行時自動更新時間戳,就像我在 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
)
要在插入期間填充列,請使用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 。
如果您需要在更新行時更新該列,則還需要一個觸發器(如EJ Brennan 所述)
請注意,對列名使用保留字通常不是一個好主意。 您應該找到與timestamp
不同的名稱
您需要編寫一個插入觸發器,如果您希望它在記錄更改時更改,則可能需要編寫一個更新觸發器。 這篇文章很好地解釋了它:
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();
更新時間戳,僅當值更改時
基於 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';
使用 'now()' 作為默認值會自動生成時間戳。
要在插入新行時自動更新 PostgresSQL 中的時間戳字段,您可以將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();
對於更新和 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();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.