列(タイプ:タイムスタンプ付きのタイムスタンプ)を使用してテーブルを作成し、デフォルト値をnow()
(current_timestamp()
)に設定しました。
単一の関数で別々のステートメントに一連の挿入を実行しましたが、すべてのタイムスタンプが(ms)まで等しいことに気付きましたが、関数の値は何らかの形でキャッシュされ、関数呼び出しまたはトランザクション全体で共有されていますか?
列(タイプ:タイムスタンプ付きのタイムスタンプ)を使用してテーブルを作成し、デフォルト値をnow()
(current_timestamp()
)に設定しました。
単一の関数で別々のステートメントに一連の挿入を実行しましたが、すべてのタイムスタンプが(ms)まで等しいことに気付きましたが、関数の値は何らかの形でキャッシュされ、関数呼び出しまたはトランザクション全体で共有されていますか?
これは予想され、文書化された動作です。
マニュアルから:
これらの関数は現在のトランザクションの開始時刻を返すため、トランザクション中に値が変更されることはありません。これは機能と見なされます。目的は、単一のトランザクションが「現在の」時間の一貫した概念を持つことを可能にし、同じトランザクション内の複数の変更が同じタイムスタンプを持つようにすることです。
ステートメントを実行するたびに変化するものが必要な場合は、を使用する必要がありますstatement_timestamp()
(clock_timestamp()
マニュアルの説明を参照してください)。
now()
およびcurrent_timestamp
は、トランザクションが開始されSTABLE
た時点をとして返す関数です。timestamptz
特に、PostgreSQLが提供する他のオプションの1つを検討してくださいstatement_timestamp()
。マニュアル:
statement_timestamp()
現在のステートメントの開始時刻(より具体的には、クライアントから最新のコマンドメッセージを受信した時刻)を返します。