web-dev-qa-db-fra.com

now () les valeurs par défaut affichent toutes le même horodatage

J'ai créé mes tables avec une colonne (type: horodatage avec fuseau horaire) et défini sa valeur par défaut sur now() (current_timestamp()).

J'exécute une série d'insertions dans des instructions distinctes dans une seule fonction et j'ai remarqué que tous les horodatages sont égaux jusqu'au (ms), la valeur de la fonction est-elle en quelque sorte mise en cache et partagée pour l'appel ou la transaction de fonction entière?

30
Ryan Fisch

C'est attendu et documenté comportement:

Du manuel:

Étant donné que ces fonctions renvoient l'heure de début de la transaction en cours, leurs valeurs ne changent pas pendant la transaction. Ceci est considéré comme une caractéristique: l'intention est de permettre à une seule transaction d'avoir une notion cohérente de l'heure "actuelle", de sorte que plusieurs modifications au sein d'une même transaction portent le même horodatage.

Si vous voulez quelque chose qui change à chaque fois que vous exécutez une instruction, vous devez utiliser statement_timestamp() ou même clock_timestamp() (voir à nouveau la description dans le manuel)

47

now() ou current_timestamp sont des fonctions STABLE renvoyant l'horodatage lorsque la transaction a commencé.

Considérez l'une des autres options proposées par PostgreSQL , en particulier statement_timestamp().
Par documentation :

statement_timestamp() renvoie l'heure de début de l'instruction en cours (plus précisément, l'heure de réception du dernier message de commande du client)

13
Erwin Brandstetter