PostgreSQL的擴展moddatetime

PostgreSQL的擴展moddatetime

moddatetime 是 PostgreSQL 的一個內置擴展,用于自動維護表的最后修改時間字段。這個擴展可以自動更新指定字段為當前時間戳,非常適合需要跟蹤記錄最后修改時間的應用場景。

一、moddatetime 基本功能

核心特性

  • 自動更新時間戳:當行數據被更新時自動設置指定字段為當前時間
  • 觸發器實現:基于 PostgreSQL 的觸發器機制
  • 輕量級:作為 contrib 模塊,不引入額外開銷

二、安裝與啟用

1. 安裝擴展

-- 連接到目標數據庫后執行
CREATE EXTENSION IF NOT EXISTS moddatetime;

2. 驗證安裝

-- 檢查已安裝擴展
SELECT * FROM pg_extension WHERE extname = 'moddatetime';-- 查看擴展函數
\df moddatetime()

三、基本使用方法

1. 創建帶有時間戳字段的表

CREATE TABLE documents (id SERIAL PRIMARY KEY,title VARCHAR(255) NOT NULL,content TEXT,created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,modified_at TIMESTAMP  -- 這個字段將由moddatetime自動維護
);

2. 創建觸發器

-- 設置modified_at字段自動更新
CREATE TRIGGER update_document_modtime
BEFORE UPDATE ON documents
FOR EACH ROW
EXECUTE FUNCTION moddatetime(modified_at);

四、高級用法示例

1. 多字段自動更新

-- 如果需要同時維護created_at和modified_at
CREATE OR REPLACE FUNCTION update_timestamps()
RETURNS TRIGGER AS $$
BEGINIF TG_OP = 'INSERT' THENNEW.created_at = NOW();NEW.modified_at = NOW();ELSIF TG_OP = 'UPDATE' THENNEW.modified_at = NOW();END IF;RETURN NEW;
END;
$$ LANGUAGE plpgsql;CREATE TRIGGER trg_update_timestamps
BEFORE INSERT OR UPDATE ON documents
FOR EACH ROW
EXECUTE FUNCTION update_timestamps();

2. 條件性更新時間戳

-- 只在特定列變更時更新時間戳
CREATE OR REPLACE FUNCTION conditional_moddatetime()
RETURNS TRIGGER AS $$
BEGINIF NEW.content IS DISTINCT FROM OLD.content OR NEW.title IS DISTINCT FROM OLD.title THENNEW.modified_at = NOW();END IF;RETURN NEW;
END;
$$ LANGUAGE plpgsql;CREATE TRIGGER trg_conditional_modtime
BEFORE UPDATE ON documents
FOR EACH ROW
EXECUTE FUNCTION conditional_moddatetime();

五、實際應用場景

1. 審計日志輔助

-- 結合審計表記錄完整修改歷史
CREATE TABLE document_audit (audit_id BIGSERIAL PRIMARY KEY,operation CHAR(1) NOT NULL,document_id INT NOT NULL,changed_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,old_data JSONB,new_data JSONB
);CREATE OR REPLACE FUNCTION log_document_changes()
RETURNS TRIGGER AS $$
BEGINIF TG_OP = 'UPDATE' THENINSERT INTO document_audit(operation, document_id, old_data, new_data)VALUES ('U', OLD.id, to_jsonb(OLD), to_jsonb(NEW));ELSIF TG_OP = 'DELETE' THENINSERT INTO document_audit(operation, document_id, old_data)VALUES ('D', OLD.id, to_jsonb(OLD));ELSIF TG_OP = 'INSERT' THENINSERT INTO document_audit(operation, document_id, new_data)VALUES ('I', NEW.id, to_jsonb(NEW));END IF;RETURN NULL;
END;
$$ LANGUAGE plpgsql;CREATE TRIGGER trg_document_audit
AFTER INSERT OR UPDATE OR DELETE ON documents
FOR EACH ROW
EXECUTE FUNCTION log_document_changes();

2. 多租戶系統中的應用

CREATE TABLE tenant_records (id BIGSERIAL PRIMARY KEY,tenant_id INT NOT NULL,record_data JSONB NOT NULL,created_by INT NOT NULL,created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,updated_by INT,updated_at TIMESTAMP,FOREIGN KEY (tenant_id) REFERENCES tenants(id)
);CREATE OR REPLACE FUNCTION update_tenant_record_meta()
RETURNS TRIGGER AS $$
BEGINIF TG_OP = 'INSERT' THENNEW.created_at = NOW();ELSIF TG_OP = 'UPDATE' THENNEW.updated_at = NOW();NEW.updated_by = current_setting('app.current_user_id')::INT;END IF;RETURN NEW;
END;
$$ LANGUAGE plpgsql;CREATE TRIGGER trg_tenant_record_meta
BEFORE INSERT OR UPDATE ON tenant_records
FOR EACH ROW
EXECUTE FUNCTION update_tenant_record_meta();

六、性能考慮與優化

1. 觸發器開銷分析

  • 每個表的 UPDATE 操作都會觸發觸發器執行
  • 在頻繁更新的表上可能影響性能
  • 建議對高負載表進行性能測試

2. 批量操作處理

-- 批量更新時臨時禁用觸發器
ALTER TABLE documents DISABLE TRIGGER update_document_modtime;-- 執行批量更新操作
UPDATE documents SET content = content || '\nUpdated' 
WHERE id BETWEEN 1000 AND 2000;-- 手動設置修改時間并重新啟用觸發器
UPDATE documents SET modified_at = NOW() 
WHERE id BETWEEN 1000 AND 2000 AND modified_at IS NULL;ALTER TABLE documents ENABLE TRIGGER update_document_modtime;

七、與其他方法的比較

方法優點缺點
moddatetime 擴展簡單易用,標準化功能較基礎
自定義觸發器高度靈活,可定制邏輯需要自行維護代碼
應用層控制業務邏輯可見容易遺漏更新
監聽邏輯解碼不侵入業務代碼配置復雜,延遲較高

八、最佳實踐建議

  1. 命名規范

    • 使用一致的字段名如 created_atupdated_at
    • 觸發器名稱包含表名和用途,如 trg_[table]_update_time
  2. 文檔記錄

    COMMENT ON TRIGGER update_document_modtime ON documents IS 
    '自動維護modified_at字段,記錄最后更新時間';
    
  3. 測試策略

    • 驗證觸發器在并發更新時的行為
    • 檢查批量操作時的性能影響
  4. 監控維護

    -- 檢查所有使用moddatetime的表
    SELECT tgname, tgrelid::regclass 
    FROM pg_trigger 
    WHERE tgname LIKE '%modtime%';
    

moddatetime 是PostgreSQL中維護最后修改時間的輕量級解決方案,特別適合需要簡單可靠地跟蹤記錄變更時間的應用場景。對于更復雜的需求,可以考慮結合自定義觸發器或專門的審計解決方案。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/909292.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/909292.shtml
英文地址,請注明出處:http://en.pswp.cn/news/909292.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

自己的電腦搭建外網訪問網站服務器的步驟

文章目錄 PC電腦做網站服務器的步驟1.前言2. 網站服務器系統的安裝2.1個人電腦安裝IIS(Windows7系統安裝IIS7.0)2.1.1:打開控制面板,給Windows安裝插件 2.2網站配置:2.2.1打開網站配置項:2.2.2開始配置&…

基于深度學習的智能語音合成系統:技術與實踐

前言 隨著人工智能技術的飛速發展,智能語音合成(Text-to-Speech, TTS)技術已經成為人機交互領域的重要組成部分。從智能助手到有聲讀物,語音合成技術正在改變我們與數字內容的交互方式。近年來,深度學習技術為語音合成…

鑄鐵平臺的制造工藝復雜而精細

鑄鐵平臺的制造工藝確實復雜而精細。首先,需要選擇合適的鑄鐵材料,通常是灰鑄鐵或球墨鑄鐵,以滿足平臺的強度和耐磨性要求。然后,根據設計要求,制作模具,并在高溫下將鐵液倒入模具中進行鑄造。在鑄造過程中…

ArcPy 與 ArcGIS .NET SDK 讀取 GDB 要素類坐標系失敗?GDAL 外掛方案詳解

ArcPy 與 ArcGIS .NET SDK 讀取 GDB 要素類坐標系失敗?GDAL 外掛方案詳解 在ArcGIS Pro中正常顯示的坐標系,為何通過ArcPy或.NET SDK卻無法正確讀取?本文將分享我在處理CGCS2000坐標系時的踩坑經歷,以及最終通過GDAL外掛方案解決問…

Zabbix 高可用架構部署方案(2最新版)

Zabbix 高可用架構部署方案(MySQL 雙 VIPHAProxyNginx) 前景提要:使用 MySQL 作為數據庫,兩個虛擬 IP(10.0.0.100 和 10.0.0.200),HAProxy 作為數據庫負載均衡,Nginx 作為 Web 訪問…

深入解析Linux分頁機制:從虛擬內存到物理地址的魔法轉換

目錄 引言:為什么需要分頁機制? 一、分頁機制基礎概念 1.1 虛擬地址與物理地址 1.2 頁與頁框 1.3 為什么是4KB? 二、多級頁表結構 2.1 為什么需要多級頁表? 2.2 x86_64的四級頁表結構 2.3 頁表項詳解 三、Linux分頁實現機…

使用python進行圖像處理—圖像變換(6)

圖像變換是指改變圖像的幾何形狀或空間位置的操作。常見的幾何變換包括平移、旋轉、縮放、剪切(shear)以及更復雜的仿射變換和透視變換。這些變換在圖像配準、圖像校正、創建特效等場景中非常有用。 6.1仿射變換(Affine Transformation) 仿射變換是一種…

NLP-數據集介紹(并不全,文本類介紹)

目錄 第一章 STS(語義文本相似度) (重點)一、SemEval STS 年度任務(2012-2017)1. SemEval-2012 STS2. SemEval-2013 STS3. SemEval-2014 STS4. SemEval-2015 STS5. SemEval-2016 STS6. SemEval-2017 STS 二…

JS進階 Day01

1.作用域和作用域鏈 let不可訪問 var可訪問,因為沒有塊作用域這一說法 2.JS垃圾回收機制以及算法 下圖如上圖同理 下圖這個三個相互引用的,根部找不到,就進行清除。 3.JS閉包 4.變量和函數提升(了解) 5.函數剩余參數和展開運算符 還有種寫法 …

詳解Python當中的pip常用命令

想象一下,如果建造房屋時,每一塊磚、每一根鋼筋都需要你自己親手燒制和打造,那會是怎樣一番景象?軟件開發也是如此。如果沒有現成的、高質量的、可復用的代碼庫,開發者們就不得不重復“發明輪子”,效率低下…

LangChain面試內容整理-知識點10:文本嵌入模型(Embeddings)使用

文本嵌入(Embeddings)是將文字轉換為向量(高維數值向量)的過程和結果。在LangChain中,Embeddings模塊負責調用各種嵌入模型,將文本轉化為向量表示,以便后續在向量空間執行相似度搜索、聚類等操作。這在實現語義搜索、RAG中非常關鍵,因為向量可以讓計算機“理解”文本語…

To be or Not to be, That‘s a Token——論文閱讀筆記——Beyond the 80/20 Rule和R2R

本周又在同一方向上刷到兩篇文章,可以說,……同學們確實卷啊,要不卷卷開放場域的推理呢? 這兩篇都在講:如何巧妙的利用帶有分支能力的token來提高推理性能或效率的。 第一篇叫 Beyond the 80/20 Rule: High-Entropy Mi…

bisheng系列(三)- 本地部署(后端 1.2版本)

一、導讀 環境:Ubuntu 24.04、open Euler 23.03、Windows 11、WSL 2、Python 3.10 、bisheng 1.2.0 背景:需要bisheng二開商用,故而此處進行本地部署,便于后期調試開發 時間:20250612 說明:bisheng的1.2…

使用 PolarProxy+Proxifier 解密 TLS 流量

一、簡介 在分析惡意樣本或加密流量時,我們常常需要將 TLS 加密通信還原為明文。 本文介紹如何通過 PolarProxy 和Proxifier 解密 TLS 流量并保存為 pcap 文件,在 Wireshark 中進行進一步分析。 二、工具準備 ? PolarProxy(推薦 Windows x64 版本)? Proxifier(強制非瀏…

[技術積累]成熟的前端和后端開發框架

1、后端 1.1、低代碼開發框架 1.1.1、jeecg 官網:JEECG技術論壇 - 基于BPM的低代碼開發平臺 1.1.2、APIJSON github官網地址:https://github.com/APIJSON gitee官網地址:https://gitee.com/Tencent/APIJSON 官網地址:騰訊AP…

產品升級 | 新一代高性能數據采集平臺BRICK2 X11,助力ADAS與自動駕駛開發

隨著ADAS(高級駕駛輔助系統)和自動駕駛(AD)開發中對數據采集與處理的需求日益增長,高性能硬件的重要性愈發凸顯。 為此,康謀正式發布了其BRICK系列的最新產品——BRICK2 X11,作為BRICK2的直接升…

螞蟻集團法人變更:韓歆毅接任,公司治理的正常安排

企查查APP顯示,6月11日,螞蟻科技集團股份有限公司發生工商變更,井賢棟卸任法定代表人,由韓歆毅接任。同時,韓歆毅由董事、總經理變更為執行公司事務的董事、總經理。目前,井賢棟仍擔任該公司董事長職務。 接…

2025虛幻游戲逆向工程解包嘗試

2025虛幻游戲逆向工程解包 前言 在2025游戲模型提取攻略寫了,但是想要找的時候又忘了在哪篇文章中寫的,所以干脆專門寫一下。中間有許多坑。 一坑接一坑。 先說結論:用Umodel(UV Viewer)查看和導出模型。FModel雖然…

Qt學習及使用_第1部分_認識Qt---Qt開發基本流程

前言 學以致用,通過QT框架的學習,一邊實踐,一邊探索編程的方方面面. 參考書:<Qt 6 C開發指南>(以下稱"本書") 標識說明:概念用粗體傾斜.重點內容用(加粗黑體)---重點內容(紅字)---重點內容(加粗紅字), 本書原話內容用深藍色標識,比較重要的內容用加粗傾…

大模型的開發應用(十):對話風格微調項目(上):數據工程與模型選型

數據工程 1 項目介紹2 數據工程2.1 申請 API Key 并測試2.2 文本嵌入模型2.3 生成訓練集2.3.1 制作風格模板2.3.2 調用大模型獲取數據2.3.3 對大模型生成的數據進行質量過濾2.3.4 程序入口 2.4 數據轉換 3 模型選型3.1 候選模型與評估數據集3.2 模型評估 附錄&#xff08;對比不…