web-dev-qa-db-ja.com

now()デフォルト値はすべて同じタイムスタンプを表示しています

列(タイプ:タイムゾーン付きタイムスタンプ)を使用してテーブルを作成し、そのデフォルト値をnow()current_timestamp())に設定しました。

単一の関数の別々のステートメントで一連の挿入を実行しますが、すべてのタイムスタンプが(ms)に等しいことに気付きました。関数値は何らかの方法でキャッシュされ、関数呼び出しまたはトランザクション全体で共有されますか?

30
Ryan Fisch

それは 期待され文書化された 振る舞いです:

マニュアルから:

これらの関数は現在のトランザクションの開始時間を返すため、トランザクション中に値は変更されません。これは機能と見なされます。その目的は、単一のトランザクションに「現在の」時間の一貫した概念を持たせ、同じトランザクション内の複数の変更に同じタイムスタンプを付けることです。

ステートメントを実行するたびに変化するものが必要な場合は、statement_timestamp()またはclock_timestamp()を使用する必要があります(再びマニュアルの説明を参照してください)

47

now()または_current_timestamp_は STABLEトランザクションが開始されたときにタイムスタンプを返す関数です

PostgreSQLが提供する他のオプション 、特にstatement_timestamp()のいずれかを検討してください。
ドキュメントごと

statement_timestamp()は、現在のステートメントの開始時間(より具体的には、クライアントからの最新のコマンドメッセージの受信時間)を返します。

13