mercoledì 13 luglio 2011

Gestire campo TIMESTAMP con MySQL

Al campo TIMESTAMP di MySql è possibile definire, in fase di creazione della tabella, la clausola DEFAULT CURRENT_TIMESTAMP.
Con questa specifica ogni volta che si effettua una insert sulla tabella il valore preso sarà il timestamp corrente (aggiornato al secondo, purtroppo anche con la versione 5.5 MySql non gestisce i millisecondi), e non è ovviamente necessario specificare il campo nella insert.
E' possibile anche specificare la clausola ON UPDATE CURRENT_TIMESTAMP, in modo che ad ogni update (di qualsiasi campo della tabella) automaticamente sia inserito il timestamp corrente.
Si noti che se si utilizzano i tool per creare la tabella e si specifica soltanto che sia not null il timestamp di default prende tutte e due le clausole DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP.
Il classico errore che si fa è specificare il campo timestamp come not null via tool, valorizzarlo nella insert da applicazione e poi "fare affidamento" su questo campo per avere informazioni su quando è stato inserito il record.
Per quanto prima descritto invece ogni volta che si effettuerà un update su quella tabella avremo il campo timestamp modificato, se volevamo un campo che tenesse traccia solo dell'inserimento avremmo dovuto definirlo come DEFAULT CURRENT_TIMESTAMP e basta.
Per gestire al meglio l'esigenza di avere un campo con il timestamp di inserimento ed uno con quello di modifica è consigliato dallo stesso manuale di certificazione MySql 5.0 il seguente "trucco".
Si crea una tabella in questo modo:


CREATE TABLE `test`.`testTimestamp` (
  `id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
  `valore` varchar(100),
  `ts_insert` TIMESTAMP NOT NULL default 0,
  `ts_update` TIMESTAMP NOT NULL on update current_timestamp,
  PRIMARY KEY (`id`)
)
ENGINE = InnoDB;
 






Si noti che il campo ts_insert, che dovrà tenere traccia dell’inserimento, è stato definito not null default 0, mentre il ts_update not null on update current_timestamp.

A questo punto in fase di inserimento dobbiamo scrivere



insert into testtimestamp(valore,ts_insert) values ('valore di test',current_timestamp);
 


Il risultato sarà il seguente:



mysql> select * from testtimestamp \G
*************************** 1. row ***************************
       id: 2
   valore: valore di test
ts_insert: 2011-07-13 12:40:36
ts_update: 0000-00-00 00:00:00
1 row in set (0.00 sec)
 


Come si può notare è stato valorizzato soltanto il campo timestamp  ts_insert.

A questo punto eseguendo un update:


update testtimestamp set valore='valore di test updated' where id=2;
 


Avremo ottenuto il nostro risultato. Infatti rieseguendo la query sulla tabella avremo:


mysql> select * from testtimestamp \G
*************************** 1. row ***************************
       id: 2
   valore: valore di test updated
ts_insert: 2011-07-13 12:40:36
ts_update: 2011-07-13 12:47:36
1 row in set (0.00 sec)
 


Come possiamo notare non è stato modificato il ts di inserimento ma solo quello di update.

Nessun commento:

Posta un commento