2012-08-31 7 views
27

Ho creato le mie tabelle con una colonna (tipo: data/ora con fuso orario) e impostato il valore predefinito su now() (current_timestamp()).now() i valori predefiniti sono tutti visualizzati con lo stesso timestamp

Eseguo una serie di inserimenti in istruzioni separate in una singola funzione e ho notato che tutti i timestamp sono uguali al (ms), il valore della funzione è in qualche modo memorizzato nella cache e condiviso per l'intera chiamata di funzione o transazione?

+0

'no()'? Intendi 'ora()'? E 'current_timestamp' non ha parentesi tesa per motivi storici. –

risposta

43

Questo è expected and documented comportamento:

Dal manuale:

Poiché queste funzioni restituiscono l'ora di avvio della transazione corrente, i loro valori non cambiano durante la transazione. Questa è considerata una funzionalità: l'intento è di consentire a una singola transazione di avere una nozione coerente del tempo "corrente", in modo che più modifiche all'interno della stessa transazione abbiano lo stesso timestamp.

Se si desidera qualcosa che cambia ogni volta che si esegue una dichiarazione, è necessario utilizzare statement_timestamp() o addirittura clock_timestamp() (ancora una volta vedere la descrizione nel manuale)

12

now() o current_timestamp sono STABLE funzioni che restituiscono il timestamp quando la transazione iniziato.

Considerare uno dei other options PostgreSQL offers, in particolare statement_timestamp().
Per documentation:

statement_timestamp() restituisce l'ora di inizio della istruzione corrente (più precisamente, il tempo di ricezione dell'ultimo messaggio di comando dal client)

Problemi correlati