全部產品
Search
文件中心

ApsaraDB RDS:自動更新時間列

更新時間:Jan 15, 2025

RDS PostgreSQL支援通過設定列層級參數on_update_set_default,在不使用觸發器的情況下,自動更新指定時間列。

前提條件

  • 執行個體大版本為PostgreSQL 15及以上。

  • 執行個體核心小版本為20241230及以上。

    說明

    如需升級核心小版本,請參見升級核心小版本

功能簡介

在某些業務情境中,應用程式希望在更新表中某一行時,即使未顯式指定時間列,也能自動更新該列。在原生PostgreSQL中,僅能通過觸發器實現此功能。RDS PostgreSQL支援通過設定列層級參數on_update_set_default,在不使用觸發器的情況下自動更新指定時間列。

該功能目前支援六種時間類型:TIMESTAMP、TIMESTAMPTZ、DATE、TIME、TIMETZ和INTERVAL。

開啟指定時間列的on_update_set_default參數

ALTER TABLE <test> ALTER COLUMN <update_time> SET(on_update_set_default=true);

使用樣本

  1. 建立測試表test並插入測試資料。

    CREATE TABLE test (id INT, create_time TIMESTAMPTZ DEFAULT now(), update_time TIMESTAMPTZ DEFAULT now());
    
    INSERT INTO test VALUES(1);
    
    SELECT * FROM test;

    返回結果:

     id |          create_time          |          update_time          
    ----+-------------------------------+-------------------------------
      1 | 2025-01-09 16:07:48.481879+08 | 2025-01-09 16:07:48.481879+08
  2. 更新測試表資料。

    UPDATE test SET id=2;
    
    SELECT * FROM test;

    返回結果,update_time列內容未更新:

     id |          create_time          |          update_time          
    ----+-------------------------------+-------------------------------
      2 | 2025-01-09 16:07:48.481879+08 | 2025-01-09 16:07:48.481879+08
  3. 修改測試表update_time列的on_update_set_default參數值,以啟用自動更新時間列的功能。

    ALTER TABLE test ALTER COLUMN update_time SET(on_update_set_default=true);
    
    SELECT attoptions FROM pg_attribute WHERE attname='update_time';

    返回結果:

              attoptions          
    ------------------------------
     {on_update_set_default=true}
  4. 更新測試表資料。

    UPDATE test SET id=3;
    
    SELECT * FROM test;

    返回結果,update_time列內容自動更新:

     id |          create_time          |          update_time          
    ----+-------------------------------+-------------------------------
      3 | 2025-01-09 16:07:48.481879+08 | 2025-01-09 16:08:39.601701+08