PostgreSQL中擴展moddatetime的使用
moddatetime 是 PostgreSQL 的一個內置擴展,用于自動維護表的最后修改時間字段。這個擴展可以自動更新指定字段為當前時間戳,非常適合需要跟蹤記錄最后修改時間的應用場景。
一、moddatetime 基本功能
核心特性
- 自動更新時間戳:當行數(shù)據(jù)被更新時自動設置指定字段為當前時間
- 觸發(fā)器實現(xiàn):基于 PostgreSQL 的觸發(fā)器機制
- 輕量級:作為 contrib 模塊,不引入額外開銷
二、安裝與啟用
1. 安裝擴展
-- 連接到目標數(shù)據(jù)庫后執(zhí)行 CREATE EXTENSION IF NOT EXISTS moddatetime;
2. 驗證安裝
-- 檢查已安裝擴展 SELECT * FROM pg_extension WHERE extname = 'moddatetime'; -- 查看擴展函數(shù) \df moddatetime()
三、基本使用方法
1. 創(chuàng)建帶有時間戳字段的表
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. 創(chuàng)建觸發(fā)器
-- 設置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 $$
BEGIN
IF TG_OP = 'INSERT' THEN
NEW.created_at = NOW();
NEW.modified_at = NOW();
ELSIF TG_OP = 'UPDATE' THEN
NEW.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 $$
BEGIN
IF NEW.content IS DISTINCT FROM OLD.content OR NEW.title IS DISTINCT FROM OLD.title THEN
NEW.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 $$
BEGIN
IF TG_OP = 'UPDATE' THEN
INSERT INTO document_audit(operation, document_id, old_data, new_data)
VALUES ('U', OLD.id, to_jsonb(OLD), to_jsonb(NEW));
ELSIF TG_OP = 'DELETE' THEN
INSERT INTO document_audit(operation, document_id, old_data)
VALUES ('D', OLD.id, to_jsonb(OLD));
ELSIF TG_OP = 'INSERT' THEN
INSERT 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. 多租戶系統(tǒng)中的應用
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 $$
BEGIN
IF TG_OP = 'INSERT' THEN
NEW.created_at = NOW();
ELSIF TG_OP = 'UPDATE' THEN
NEW.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();
六、性能考慮與優(yōu)化
1. 觸發(fā)器開銷分析
- 每個表的 UPDATE 操作都會觸發(fā)觸發(fā)器執(zhí)行
- 在頻繁更新的表上可能影響性能
- 建議對高負載表進行性能測試
2. 批量操作處理
-- 批量更新時臨時禁用觸發(fā)器 ALTER TABLE documents DISABLE TRIGGER update_document_modtime; -- 執(zhí)行批量更新操作 UPDATE documents SET content = content || '\nUpdated' WHERE id BETWEEN 1000 AND 2000; -- 手動設置修改時間并重新啟用觸發(fā)器 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;
七、與其他方法的比較
| 方法 | 優(yōu)點 | 缺點 |
|---|---|---|
| moddatetime 擴展 | 簡單易用,標準化 | 功能較基礎 |
| 自定義觸發(fā)器 | 高度靈活,可定制邏輯 | 需要自行維護代碼 |
| 應用層控制 | 業(yè)務邏輯可見 | 容易遺漏更新 |
| 監(jiān)聽邏輯解碼 | 不侵入業(yè)務代碼 | 配置復雜,延遲較高 |
八、最佳實踐建議
命名規(guī)范:
- 使用一致的字段名如
created_at和updated_at - 觸發(fā)器名稱包含表名和用途,如
trg_[table]_update_time
- 使用一致的字段名如
文檔記錄:
COMMENT ON TRIGGER update_document_modtime ON documents IS '自動維護modified_at字段,記錄最后更新時間';
測試策略:
- 驗證觸發(fā)器在并發(fā)更新時的行為
- 檢查批量操作時的性能影響
監(jiān)控維護:
-- 檢查所有使用moddatetime的表 SELECT tgname, tgrelid::regclass FROM pg_trigger WHERE tgname LIKE '%modtime%';
moddatetime 是PostgreSQL中維護最后修改時間的輕量級解決方案,特別適合需要簡單可靠地跟蹤記錄變更時間的應用場景。對于更復雜的需求,可以考慮結合自定義觸發(fā)器或專門的審計解決方案。
到此這篇關于PostgreSQL中擴展moddatetime的使用的文章就介紹到這了,更多相關PostgreSQL moddatetime擴展內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Linux CentOS 7安裝PostgreSQL9.3圖文教程
這篇文章主要為大家詳細介紹了Linux CentOS 7安裝PostgresSQL9.3圖文教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-11-11
PostgreSQL教程(五):函數(shù)和操作符詳解(1)
這篇文章主要介紹了PostgreSQL教程(五):函數(shù)和操作符詳解(1),本文講解了邏輯操作符、比較操作符、數(shù)學函數(shù)和操作符、三角函數(shù)列表、字符串函數(shù)和操作符等內容,需要的朋友可以參考下2015-05-05
postgresql數(shù)據(jù)庫執(zhí)行計劃圖文詳解
了解PostgreSQL執(zhí)行計劃對于程序員來說是一項關鍵技能,執(zhí)行計劃是我們優(yōu)化查詢,驗證我們的優(yōu)化查詢是否確實按照我們期望的方式運行的重要方式,這篇文章主要給大家介紹了關于postgresql數(shù)據(jù)庫執(zhí)行計劃的相關資料,需要的朋友可以參考下2024-01-01
PostgreSQL數(shù)據(jù)庫遷移部署實戰(zhàn)教程
這篇文章主要介紹了PostgreSQL數(shù)據(jù)庫遷移部署實戰(zhàn)教程,由于項目本身就是基于PostgreSQL數(shù)據(jù)庫構建的,因此數(shù)據(jù)庫遷移將變得十分便捷,接下來,我將簡要介紹我們的遷移步驟,需要的朋友可以參考下2023-07-07
PostgreSQL 如何查找需要收集的vacuum 表信息
這篇文章主要介紹了PostgreSQL 如何查找需要收集的vacuum 表信息,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-02-02
解決sqoop import 導入到hive后數(shù)據(jù)量變多的問題
這篇文章主要介紹了解決sqoop import 導入到hive后數(shù)據(jù)量變多的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12
基于PostgreSQL/openGauss?的分布式數(shù)據(jù)庫解決方案
ShardingSphere-Proxy?作為透明數(shù)據(jù)庫代理,用戶無需關心?Proxy?如何協(xié)調背后的數(shù)據(jù)庫。今天通過本文給大家介紹基于PostgreSQL/openGauss?的分布式數(shù)據(jù)庫解決方案,感興趣的朋友跟隨小編一起看看吧2021-12-12
PostgreSQL Public 模式的風險及安全遷移問題小結
本文主要討論了PostgreSQL中public模式的問題和解決方案,public模式默認對所有用戶開放訪問權限,容易發(fā)生命名沖突,且難以維護和隔離,修改或刪除它可能導致擴展無法正常工作,為解決這問題,建議新建模式,將public模式下的所有業(yè)務對象遷移過去2024-10-10

