Question & Answer
Question
現在時刻 (CURRENT TIMESTAMP) をユニーク列に挿入すると、SQL0803N (重複キー・エラー) で失敗することがあります。 CURRENT TIMESTAMP は固有な値を返さないのでしょうか。
Cause
CURRENT TIMESTAMP が返す値は必ずしも固有値ではありません。
特に Db2 Windows 版は CURRENT TIMESTAMP のマイクロ秒部分を 000 でパディングしているため、重複値が返りやすくなっています。これは、Windows で現在時刻を戻す API (GetLocalTime) が SYSTEMTIME 構造体にミリ秒までの時刻しか定義していないためです。
Db2 はほぼ同時に現在時刻を取得した場合、マイクロ秒部分を 001, 002 のようにインクリメントする機構があります。しかし、マイクロ秒部分の重複を完全に防ぐことは保障されていません。
GetLocalTime function
SYSTEMTIME structure
注: Windows にマイクロ秒の精度で現在時刻を返す関数はありません。
特に Db2 Windows 版は CURRENT TIMESTAMP のマイクロ秒部分を 000 でパディングしているため、重複値が返りやすくなっています。これは、Windows で現在時刻を戻す API (GetLocalTime) が SYSTEMTIME 構造体にミリ秒までの時刻しか定義していないためです。
Db2 はほぼ同時に現在時刻を取得した場合、マイクロ秒部分を 001, 002 のようにインクリメントする機構があります。しかし、マイクロ秒部分の重複を完全に防ぐことは保障されていません。
GetLocalTime function
SYSTEMTIME structure
注: Windows にマイクロ秒の精度で現在時刻を返す関数はありません。
Answer
マニュアルに記述されているように、Db2 の CURRENT TIMESTAMP は重複値を返す可能性があります。CURRENT TIMESTAMP が固有値を返す前提のアプリケーションは、以下のような手法で固有値に変換してください。
V9.1 の新機能: CURRENT TIMESTAMP 特殊レジスターが重複値を戻す
例
db2 "values (TIMESTAMP(GENERATE_UNIQUE()) + CURRENT TIMEZONE)"
注:
Oracle の データ・タイプ DATE の TIMESTAMP(0) への互換性が有効なデータベースでは、以下のように TIMESTAMP 関数の結果と CURRENT TIMEZONE を演算するために HOUR 関数などによる調整が必要です。
db2 "values (TIMESTAMP(GENERATE_UNIQUE()) - HOUR(CURRENT TIMEZONE) hours)"
運用上の考慮点
Db2 Linux/UNIX 版は gettimeofday 関数から現在時刻を取り出すため、マイクロ秒までの精度があります。
ただし、Linux/UNIX 版でも時刻が重複しないことは保障されていません。
NTP などで時刻を調整している場合、GENERATE_UNIQUE() を使っても時刻が重複する可能性があります。
関連情報
CURRENT TIMESTAMP function behaves differently between UNIX and Windows platforms.
V9.1 の新機能: CURRENT TIMESTAMP 特殊レジスターが重複値を戻す
例
db2 "values (TIMESTAMP(GENERATE_UNIQUE()) + CURRENT TIMEZONE)"
注:
Oracle の データ・タイプ DATE の TIMESTAMP(0) への互換性が有効なデータベースでは、以下のように TIMESTAMP 関数の結果と CURRENT TIMEZONE を演算するために HOUR 関数などによる調整が必要です。
db2 "values (TIMESTAMP(GENERATE_UNIQUE()) - HOUR(CURRENT TIMEZONE) hours)"
運用上の考慮点
Db2 Linux/UNIX 版は gettimeofday 関数から現在時刻を取り出すため、マイクロ秒までの精度があります。
ただし、Linux/UNIX 版でも時刻が重複しないことは保障されていません。
NTP などで時刻を調整している場合、GENERATE_UNIQUE() を使っても時刻が重複する可能性があります。
関連情報
CURRENT TIMESTAMP function behaves differently between UNIX and Windows platforms.
[{"Type":"MASTER","Line of Business":{"code":"LOB10","label":"Data and AI"},"Business Unit":{"code":"BU058","label":"IBM Infrastructure w\/TPS"},"Product":{"code":"SSEPGG","label":"Db2 for Linux, UNIX and Windows"},"ARM Category":[{"code":"a8m500000008PmFAAU","label":"Operating System or Hardware-\u003EOS Configuration"},{"code":"a8m0z0000001gNyAAI","label":"Runtime"}],"ARM Case Number":"","Platform":[{"code":"PF025","label":"Platform Independent"}],"Version":"All Versions"}]
Was this topic helpful?
Document Information
Modified date:
04 November 2023
UID
swg21579694