欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

PostgreSQL中擴展moddatetime的使用

 更新時間:2025年06月15日 10:33:36   作者:文牧之  
PostgreSQL的moddatetime擴展通過觸發(fā)器自動維護時間戳字段,輕量高效,適用于審計日志和多租戶系統(tǒng),具有一定的參考價值,感興趣的可以了解一下

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ù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 基于postgresql行級鎖for update測試

    基于postgresql行級鎖for update測試

    這篇文章主要介紹了基于postgresql行級鎖for update測試,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • postgresql連續(xù)歸檔及時間點恢復的操作

    postgresql連續(xù)歸檔及時間點恢復的操作

    這篇文章主要介紹了postgresql連續(xù)歸檔及時間點恢復的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • PostgreSQL利用遞歸優(yōu)化求稀疏列唯一值的方法

    PostgreSQL利用遞歸優(yōu)化求稀疏列唯一值的方法

    這篇文章主要介紹了PostgreSQL利用遞歸優(yōu)化求稀疏列唯一值的方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • PostgreSQL用戶、數(shù)據(jù)庫及表的管理、操作與授權方式

    PostgreSQL用戶、數(shù)據(jù)庫及表的管理、操作與授權方式

    這篇文章主要介紹了PostgreSQL用戶、數(shù)據(jù)庫及表的管理、操作與授權操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • PostgreSQL時間處理的一些常用方式總結

    PostgreSQL時間處理的一些常用方式總結

    PostgreSQL提供了許多返回當前日期和時間的函數(shù),下面這篇文章主要給大家介紹了關于PostgreSQL時間處理的一些常用方式,文中通過圖文以及實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-03-03
  • postgresql 刪除重復數(shù)據(jù)的幾種方法小結

    postgresql 刪除重復數(shù)據(jù)的幾種方法小結

    這篇文章主要介紹了postgresql 刪除重復數(shù)據(jù)的幾種方法小結,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • Mybatis調用PostgreSQL存儲過程實現(xiàn)數(shù)組入?yún)鬟f

    Mybatis調用PostgreSQL存儲過程實現(xiàn)數(shù)組入?yún)鬟f

    這篇文章主要介紹了mybatis調用postgresql自定義函數(shù)傳遞數(shù)組參數(shù)的解決方案,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • 淺談PostgreSQL表分區(qū)的三種方式

    淺談PostgreSQL表分區(qū)的三種方式

    隨著使用時間的增加,數(shù)據(jù)庫中的數(shù)據(jù)量也不斷增加,因此數(shù)據(jù)庫查詢越來越慢。加速數(shù)據(jù)庫的方法很多,如添加特定的索引,將日志目錄換到單獨的磁盤分區(qū),調整數(shù)據(jù)庫引擎的參數(shù)等。本文即將介紹的數(shù)據(jù)庫表分區(qū)即能達到此效果
    2021-06-06
  • PostgreSQL之連接失敗的問題及解決

    PostgreSQL之連接失敗的問題及解決

    這篇文章主要介紹了PostgreSQL之連接失敗的問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • 史上最全PostgreSQL?DBA最常用SQL

    史上最全PostgreSQL?DBA最常用SQL

    這篇文章主要介紹了PostgreSQL?DBA最常用SQL?,主要包括背景及常用查詢語句,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-10-10

最新評論