2011-12-03 3 views
6

Devo tenere traccia del tempo in cui una riga è stata inserita nel database e dell'ora in cui è stata modificata l'ultima volta.Timestamp per creazione di righe e ultima modifica

Ho cercato di creare due colonne separate, e utilizzare CURRENT_TIMESTAMP:

create table def (
    id int, 
    creation timestamp 
    default CURRENT_TIMESTAMP, 
    modification timestamp 
    on update CURRENT_TIMESTAMP 
); 

Tuttavia, questo ha prodotto un errore:

ERROR 1293 (HY000): Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause

Qual è il modo migliore per farlo?

Sto pensando alla procedura memorizzata, ma alla ricerca di una soluzione standard. Mi occupo anche dei privilegi di accesso, dato che pochi programmi/elementi dovrebbero essere in grado di toccare il più possibile i timestamp.


Anche se io preferirei risposte MySQL, soluzioni per gli altri RDBMS di sono anche apprezzato!

+0

Penso che il timestamp di modifica "feature mancante" sia stato corretto dopo anni in una delle versioni più recenti di MySQL. – hakre

risposta

3

Ya questa è una limitazione zoppa su MySQL. Se si sta attraversando un'applicazione, è possibile aggiungere una chiamata time() per la colonna created_at e lasciare che la colonna updated_at utilizzi CURRENT_TIMESTAMP.

$sql = "INSERT INTO my_table SET name = 'Mike', created_at = " . time(); 

mi piacerebbe optare per fare questo per la colonna created_at come probabilmente non sarà toccato tutte le volte che la colonna updated_at.

- Modifica -

Meglio ancora, utilizzare MySQL incorporato nel now() funzione. In questo modo devi solo preoccuparti del fuso orario del server mysql e non dei fusi orari del server dell'app E del server mysql.

$sql = "INSERT INTO my_table SET name = 'Mike', created_at = NOW()"; 
+1

Buon punto su quale colonna usare 'CURRENT_TIMESTAMP' su. –

+1

Puoi anche usare il comando 'NOW()' di MySQL se non sbaglio. – Kevin

+1

@kevin: sei corretto, e tbh, NOW() è l'alternativa preferita, in questo modo hai a che fare solo con il fuso orario del server mysql, invece del server che esegue il codice app E il server mysql. –

2

È possibile utilizzare un trigger. L'applicazione può anche impostare il valore, ma se lo fa, verrà sovrascritto dal database.

delimiter // 
CREATE TRIGGER def_bef_update BEFORE UPDATE ON def FOR EACH ROW BEGIN 
    SET NEW.modification = CURRENT_TIMESTAMP; 
END// 
delimiter ; 

È inoltre possibile utilizzarlo per controllare i dati e aggiornare la data di modifica solo se presenta modifiche importanti.