Nella dichiarazione di un campo di tipo timestamp viene per default abilitata la valorizzazione automatica all’istante corrente del campo quando inseriamo un nuovo record. Ad esempio, se in una tabella attivita abbiamo un campo data dichiarato come timestamp, quando inseriamo un nuovo record il campo verrà popolato anche senza la sua presenza esplicita nell’istruzione SQL. Supponiamo allora di avere questa tabella attivita così definita:
create table attivita1 ( id int(10) auto_increment primary key, id_commessa int(10) not null, descrizione varchar(100) not null, data timestamp not null );
Ora, se inserisco un record senza citare esplicitamente il campo data
insert into attivita (id_commessa, descrizione) values (123, 'Nuovo incarico');
nel campo data avrò il valore dell’istante in cui è stata eseguita l’istruzione (un po’ allo stesso modo con cui viene popolato un campo auto_increment).
Il problema (dal mio punto di vista per questa particolare applicazione) è che lo stesso comportamento si verifica anche per un update:
update attività set id_commessa=321 where id=100
Anche il campo data, non esplicitamente citato nell’istruzione, cambierà. A volte ciò non è desiderabile. Per evitare questo comportamento dobbiamo modificare la tabella con una istruzione DDL:
ALTER TABLE attivita CHANGE data data TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
Così facendo non ho questo fastidioso (in questo caso) effetto collaterale.
Se non si dichiara esplicitamente il comportamento del default in fase di creazione, MySQL aggiungerà automaticamente anche questa direttiva:
DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
che causerà il comportamento indesiderato durante l’aggiornamento.
Commenti recenti