最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

相關文章

  • Linux CentOS 7安裝PostgreSQL9.3圖文教程

    Linux CentOS 7安裝PostgreSQL9.3圖文教程

    這篇文章主要為大家詳細介紹了Linux CentOS 7安裝PostgresSQL9.3圖文教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • PostgreSQL教程(五):函數(shù)和操作符詳解(1)

    PostgreSQL教程(五):函數(shù)和操作符詳解(1)

    這篇文章主要介紹了PostgreSQL教程(五):函數(shù)和操作符詳解(1),本文講解了邏輯操作符、比較操作符、數(shù)學函數(shù)和操作符、三角函數(shù)列表、字符串函數(shù)和操作符等內容,需要的朋友可以參考下
    2015-05-05
  • postgresql數(shù)據(jù)庫執(zhí)行計劃圖文詳解

    postgresql數(shù)據(jù)庫執(zhí)行計劃圖文詳解

    了解PostgreSQL執(zhí)行計劃對于程序員來說是一項關鍵技能,執(zhí)行計劃是我們優(yōu)化查詢,驗證我們的優(yōu)化查詢是否確實按照我們期望的方式運行的重要方式,這篇文章主要給大家介紹了關于postgresql數(shù)據(jù)庫執(zhí)行計劃的相關資料,需要的朋友可以參考下
    2024-01-01
  • PostgreSQL LIKE 大小寫實例

    PostgreSQL LIKE 大小寫實例

    這篇文章主要介紹了PostgreSQL LIKE 大小寫實例,具有很好的參考價值,希望對大家有所幫助。 一起跟隨小編過來看看吧
    2021-01-01
  • PostgreSQL中ANALYZE命令的使用

    PostgreSQL中ANALYZE命令的使用

    PostgreSQL中ANALYZE用于收集統(tǒng)計信息以優(yōu)化查詢,文中通過示例代碼詳細的介紹了ANALYZE使用,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-06-06
  • PostgreSQL數(shù)據(jù)庫遷移部署實戰(zhàn)教程

    PostgreSQL數(shù)據(jù)庫遷移部署實戰(zhàn)教程

    這篇文章主要介紹了PostgreSQL數(shù)據(jù)庫遷移部署實戰(zhàn)教程,由于項目本身就是基于PostgreSQL數(shù)據(jù)庫構建的,因此數(shù)據(jù)庫遷移將變得十分便捷,接下來,我將簡要介紹我們的遷移步驟,需要的朋友可以參考下
    2023-07-07
  • PostgreSQL 如何查找需要收集的vacuum 表信息

    PostgreSQL 如何查找需要收集的vacuum 表信息

    這篇文章主要介紹了PostgreSQL 如何查找需要收集的vacuum 表信息,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • 解決sqoop import 導入到hive后數(shù)據(jù)量變多的問題

    解決sqoop import 導入到hive后數(shù)據(jù)量變多的問題

    這篇文章主要介紹了解決sqoop import 導入到hive后數(shù)據(jù)量變多的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • 基于PostgreSQL/openGauss?的分布式數(shù)據(jù)庫解決方案

    基于PostgreSQL/openGauss?的分布式數(shù)據(jù)庫解決方案

    ShardingSphere-Proxy?作為透明數(shù)據(jù)庫代理,用戶無需關心?Proxy?如何協(xié)調背后的數(shù)據(jù)庫。今天通過本文給大家介紹基于PostgreSQL/openGauss?的分布式數(shù)據(jù)庫解決方案,感興趣的朋友跟隨小編一起看看吧
    2021-12-12
  • PostgreSQL Public 模式的風險及安全遷移問題小結

    PostgreSQL Public 模式的風險及安全遷移問題小結

    本文主要討論了PostgreSQL中public模式的問題和解決方案,public模式默認對所有用戶開放訪問權限,容易發(fā)生命名沖突,且難以維護和隔離,修改或刪除它可能導致擴展無法正常工作,為解決這問題,建議新建模式,將public模式下的所有業(yè)務對象遷移過去
    2024-10-10

最新評論

德化县| 镇原县| 枞阳县| 洪湖市| 略阳县| 库伦旗| 井冈山市| 大荔县| 宁明县| 兴宁市| 三亚市| 崇阳县| 治县。| 涿州市| 江口县| 义乌市| 化隆| 保德县| 辰溪县| 元氏县| 灵宝市| 龙门县| 凤凰县| 青龙| 依安县| 玛纳斯县| 景泰县| 旬邑县| 隆尧县| 富裕县| 宁波市| 南安市| 临湘市| 黄石市| 邛崃市| 印江| 阿瓦提县| 双鸭山市| 南宁市| 吉木乃县| 黎城县|