PostgreSQL自動更新時間戳

大雄45發表於2021-12-16
導讀 最近有這麼一個工程,需要使用postgresql資料庫,在資料庫中的好幾個表中都需要時間戳這個欄位,這篇文章主要給大家介紹了關於PostgreSQL自動更新時間戳的相關資料,需要的朋友可以參考下
什麼是PostgreSQL時間戳資料型別?

在PostgreSQL中,下一個資料型別是 TIMESTAMP ,它可以儲存 TIME 和 DATE 值。但它不支援任何 時區資料。這意味著當我們轉換資料庫伺服器的 時區時, 時間戳值將儲存在資料庫中,並且不能重複修改。

在PostgreSQL中,TIMESTAMP資料型別分為 兩種時間資料型別,如下:

timestamp

timpstamptz

Timestamp: : 使用時間戳資料型別 ,不帶時區。

Timestamptz: : timestamptz資料型別用於帶有時區的 。

注意:

  • timestamptz資料型別是與時區相關的日期和時間資料型別,並且是具有時區的時間戳。
  • 時間戳和時間戳儲存時間戳值的 8位元組儲存,如以下 所示:
SELECT typname, typlen
FROM pg_type
WHERE typname ~ '^timestamp';

最近一段時間公司有一些入職的實習生在使用PostgreSQL建立表Schema時,對建立時間create_at和更新時間update_at欄位自動更新時間戳不是很清楚。記錄這篇文章,讓後面來的實習生和新同事有一個參考。

一、為什麼

在講如何更新時間戳之前,我們還是要了解為何有必要自動更新時間戳。對於很多業務表,我們大多數需要記錄以下幾個欄位:

  • create_at 建立時間
  • update_at 更新時間
  • create_by 建立人
  • update_by 更新人

為了給這些欄位賦值,我們需要在repository層為entity賦值,建立時間和更新時間就取當前系統時間LocalDateTime,建立人和更新人需要用系統使用者去賦值。對於建立時間和更新時間,這種與當前業務無關的欄位,有沒有可能不在repository上每次去手動賦值。

當然,肯定是有的,建立時間無非就是資料新插入行的時間,更新時間就是行資料更新的時間,理解了這一層的含義,那就有解決辦法了。

對於Mysql來說,其內部提供的函式對於建立時間和更新時間的欄位的自動更新是相當容易的,但對於PostgreSQL事情會稍稍複雜一點。

二、如何做

要在插入資料的時候自動填充 create_at列的值,我們可以使用DEFAULT值,如下面所示。

CREATE TABLE users (
  ...
  create_at timestamp(6) default current_timestamp
)

為create_at欄位設定一個預設值current_timestamp當前時間戳,這樣達到了透過在 INSERT 語句中提供值來顯式地覆蓋該列的值。

但上面的這種方式只是對於insert行資料的時候管用,如果對行更新的時候,我們需要使用到資料庫的觸發器trigger。

首先我們編寫一個觸發器update_modified_column如下面的程式碼所示,含義是更新表的欄位update_at為當前時間戳。

CREATE OR REPLACE FUNCTION update_modified_column()
RETURNS TRIGGER AS $$
BEGIN
    NEW.update_at = now();
    RETURN NEW;
END;
$$ language 'plpgsql';

然後我們應用這個觸發器,如何應用呢?當然是為這個觸發器設定觸發條件。

CREATE TRIGGER update_table_name_update_at BEFORE UPDATE ON table_name FOR EACH ROW EXECUTE PROCEDURE  update_modified_column();

即代表的含義是更新表table_name行資料的時候,執行這個觸發器,我們需要為每一個表設定應用這個觸發器!至此,達到目的。

原文來自

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2847590/,如需轉載,請註明出處,否則將追究法律責任。

相關文章