機能紹介
ON UPDATE CURRENT_TIMESTAMP は MySQL モードの列属性であり、行データが更新(UPDATE)された際に、その列の値を現在時刻に自動的に設定します。主にデータ行の最終変更時刻を記録するために使用されます。
OceanBase データベースでは、TIMESTAMP 列と DATETIME 列はこの属性の使用をサポートしており、動作は MySQL と一致しています。
機能の概要
テーブル内の行データが更新されると、システムは ON UPDATE CURRENT_TIMESTAMP 属性を定義した列を現在時刻に自動的に設定します。アプリケーションから明示的に値を代入する必要はありません。この属性は通常、DEFAULT CURRENT_TIMESTAMP と組み合わせて使用されます:DEFAULT CURRENT_TIMESTAMP は挿入(INSERT)時に作成時刻を記録し、ON UPDATE CURRENT_TIMESTAMP は更新時に最終変更時刻を自動的に管理します。
適用シナリオ
- 監査ログ:データの最終変更時刻を記録し、データ変更履歴を追跡する
- データ同期:レコードの更新時刻を自動的に管理し、増分同期を容易にする
- 業務テーブル設計:行の最終変更時刻を記録する必要があるシナリオで、アプリケーションの開発作業量を削減する
構文
CREATE TABLE ステートメントの列定義で指定します。構文は以下のとおりです:
列名 TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
タイムスタンプの精度を指定することもできます。精度値は列定義内の精度と一致している必要があります:
列名 TIMESTAMP(6) DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6)
DATETIME 列の使用方法も同じです:
列名 DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
説明
- この属性は
TIMESTAMP列とDATETIME列にのみ適用され、他の型の列はサポートされていません。ON UPDATE CURRENT_TIMESTAMPの後の精度は列定義の精度と一致している必要があります。そうでない場合、エラーが発生します。例えば、列をTIMESTAMP(6)と定義した場合は、ON UPDATE CURRENT_TIMESTAMP(6)を使用する必要があります。CREATE TABLEの他に、ALTER TABLEのADD COLUMN、MODIFY COLUMN、CHANGE COLUMN操作でもこの属性の使用がサポートされています。
例
作成日時と変更日時の列を含むテーブルを作成します:
obclient> CREATE TABLE t1 (
id INT PRIMARY KEY,
c1 VARCHAR(20),
gmt_create TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
gmt_modified TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
Query OK, 0 rows affected
obclient> INSERT INTO t1(id, c1) VALUES (1, 'a');
Query OK, 1 row affected
obclient> SELECT id, c1, gmt_create, gmt_modified FROM t1;
+----+------+---------------------+---------------------+
| id | c1 | gmt_create | gmt_modified |
+----+------+---------------------+---------------------+
| 1 | a | 2026-08-20 15:38:28 | 2026-08-20 15:38:28 |
+----+------+---------------------+---------------------+
1 row in set
obclient> UPDATE t1 SET c1 = 'b' WHERE id = 1;
Query OK, 1 row affected
obclient> SELECT id, c1, gmt_modified FROM t1;
+----+------+---------------------+
| id | c1 | gmt_modified |
+----+------+---------------------+
| 1 | b | 2026-08-20 15:38:30 |
+----+------+---------------------+
1 row in set
結果からわかるように、UPDATE を実行すると、gmt_modified 列の値は現在のタイムスタンプに自動的に更新されますが、gmt_create 列は変更されません。
精度を指定する例:
obclient> CREATE TABLE t2 (
c1 TIMESTAMP(6) DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6)
);
Query OK, 0 rows affected
注意点
- MySQLモード専用:この属性はMySQL互換モードの機能であり、Oracleモードではサポートされていません。
- 精度の一致:
ON UPDATE CURRENT_TIMESTAMPの精度は列定義の精度と一致している必要があります。そうでない場合、エラーが発生します。 DEFAULT CURRENT_TIMESTAMPとの併用:挿入時に初期値を確保するため、DEFAULT CURRENT_TIMESTAMPも同時に指定することを推奨します。- 暗黙のデフォルト属性:システム変数
explicit_defaults_for_timestampが OFF(デフォルト値)の場合、テーブルの最初のTIMESTAMP列にNULL属性とデフォルト値が明示的に指定されていない場合、システムは自動的にその列にDEFAULT CURRENT_TIMESTAMPおよびON UPDATE CURRENT_TIMESTAMP属性を追加します。この変数の詳細については、explicit_defaults_for_timestampを参照してください。 - データ変更時のみトリガー:
UPDATEによって行内の他の列の値が実際に変更された場合にのみ、ON UPDATE CURRENT_TIMESTAMP列が更新されます。更新後の行データに変更がない場合(例:UPDATE t1 SET c1 = c1)、その列はリフレッシュされません。 - 並列DMLの制限:
ON UPDATE CURRENT_TIMESTAMP列を含むテーブルは並列DMLをサポートしません。詳細については、並列実行の分類を参照してください。