2010-08-15 11 views
9

Sto creando alcune tabelle in cui voglio memorizzare l'ora in cui è stato creato un record e quando è stato aggiornato l'ultima volta. Pensavo di poter avere due campi di data/ora in cui uno avrebbe il valore CURRENT_TIMESTAMP e l'altro avrebbe CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP. Ma suppongo di non poterlo fare perché puoi avere solo un campo data/ora con un valore predefinito in una tabella?MySQL crea ora e data/ora di aggiornamento

Come consiglieresti di ricevere e memorizzare le due volte? Grazie!

risposta

8

È possibile avere due colonne di tipo timestamp in una tabella.

i seguenti lavori per MySQL 5,0

 
create table t 
(
    id integer, 
    created_at timestamp default current_timestamp, 
    updated_at timestamp 
); 

Penso che si sta confondendo questo con SQL Server (dove timestamp non è proprio un "time stamp" e non v'è infatti un limite su una colonna singola "timestamp")

Modifica: ma è necessario un trigger per aggiornare la colonna update_at ogni volta che viene modificata la riga.

+0

Corretto, il timestamp di SQL Server è in realtà solo un sinonimo per rowversion – SQLMenace

+0

Ciò potrebbe essere eseguito, ma il campo updated_at non viene aggiornato alle modifiche. Pensavo che l'aggiunta di ON UPDATE CURRENT_TIMESTAMP sulla colonna updated_at avrebbe risolto il problema. Questo è quando si lamenta che questo non può essere fatto. – Aishwar

+0

Sì, come ho detto: è necessario utilizzare un trigger per compilare la colonna updated_at –

2

Per quanto ne so, non c'è soluzione per questa restrizione. Dovrai impostare manualmente (almeno) uno dei timestamp, il modo più semplice è semplicemente aggiungere updated = NOW() alla query UPDATE.

+0

uno che fa sembrare come una soluzione praticabile. Mi sarebbe piaciuto molto, se il server potesse farlo automaticamente :) – Aishwar

+0

Tuttavia, potrebbe essere possibile con i trigger, ma penso che non sia un'ottima soluzione. –

+0

Di solito è fatto vice-versa: si specifica manualmente 'created = NOW()' e 'updated' viene impostato automaticamente.Il motivo è che crei un record 1 volta ma gli aggiornamenti possono essere illimitati. – Stalinko

0

Avrete bisogno di due colonne: CREATE_TIME e UPDATE_TIME.

È possibile aggiungere CREATE_USER e UPDATE_USER.

Forse si vorrebbe avere una relazione 1: molti con il nome della colonna modificata, vecchi e nuovi valori.

Fa tutto parte della cattura dei dati di modifica. Potresti avere tabelle CDC che vengono aggiornate utilizzando i trigger.

+0

Ho due colonne per memorizzare il tempo di creazione e l'ora di aggiornamento - ma non riesco a impostare i due valori predefiniti che ho indicato sopra. Analizzerò cos'è il CDC. Non dovrebbe esserci una soluzione semplice a questo? Immagino che questo sia uno scenario comune. – Aishwar

+0

È comune, ma non credo che MySQL abbia una soluzione integrata per questo. Oracle e SQL Server fanno. Non dovrebbe essere difficile da fare: pochi tavoli e grilletti. – duffymo

0

Vorrei lasciare il timestamp corrente nel modo suggerito e compilare il campo created_at con la data corrente su insert.

14

Un buon modo per creare campi come 'creato' e 'aggiornato' è

CREATE TABLE `mytable` ( 
`id` INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY, 
`created` TIMESTAMP DEFAULT '0000-00-00 00:00:00', 
`updated` TIMESTAMP DEFAULT now() ON UPDATE now(), 
`myfield` VARCHAR(255) 
); 

E il suo necessario entrare i null in entrambe le colonne durante la "insert":

INSERT INTO mytable (created,updated,myfield) VALUES (null,null,'blablabla'); 

Ed ora, in tutti gli aggiornamenti, il campo 'aggiornato' avrà un nuovo valore con la data effettiva.

UPDATE mytable SET myfield='blablablablu' WHERE myfield='blablabla'; 

Fonte: http://gusiev.com/2009/04/update-and-create-timestamps-with-mysql/

+2

Questa è la soluzione migliore che ho trovato. La magia è che NULL è tradotto in NOW() sull'inserto. In una tipica applicazione, ci saranno più modi per aggiornare una riga piuttosto che crearla, quindi questo sembra meno di manutenzione rispetto al "uno ora" per creare e gestire manualmente gli aggiornamenti, utilizzando un trigger separato o un altro approccio. – botimer

+1

Ha funzionato meravigliosamente! Sebbene nella mia situazione non sembrasse aver bisogno di passare i valori nulli e solo la colonna aggiornata è cambiata. Sembra funzionare bene. 'created_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP SU UPDATE CURRENT_TIMESTAMP,' ... – Jordan

7

a partire da MySQL versione 5.6.5 si può fare questo usando il difetto e ON UPDATE. Non sono necessari trigger.

ts_create TIMESTAMP DI DEFAULT CURRENT_TIMESTAMP, ts_update TIMESTAMP DI DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

+0

In questo momento, questa è la migliore risposta! – v010dya