2011-02-04 4 views
56

voglio definire tavolo che avrà 2 campi data e ora, someting in questo modo:MySQL CURRENT_TIMESTAMP sul creare e aggiornata

CREATE TABLE `msgs` (
    `id` INT PRIMARY KEY AUTO_INCREMENT, 
    `msg` VARCHAR(256), 
    `ts_create` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, 
    `ts_update` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 
) 

Come fare questo errore evitando:

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

Point è quello di mantenere il comportamento desiderato di ts_create e ts_update nello schema della tabella.

+0

Credo che l'errore sia chiaro e quello che cerchi sia il modo alternativo di usare la stessa cosa come current_timestamp – GusDeCooL

risposta

45

Questa è una limitazione di mySQL, è impossibile avere due colonne TIMESTAMP con valori predefiniti che fanno riferimento a CURRENT_TIMESTAMP. L'unico modo per farlo sarebbe utilizzare un tipo DATETIME per ts_create che sfortunatamente non può avere un valore predefinito di NOW(). Puoi lanciare il tuo grilletto per farlo accadere però.

+34

MySQL ora supporta più colonne TIMESTAMP che fanno riferimento a CURRENT_TIMESTAMP (dalla versione 5.6.5 rilasciata nel 2012). http://dev.mysql.com/doc/relnotes/mysql/5.6/en/news-5-6-5.html – Vaughan

0

Penso che tu voglia ts_create come datetime (quindi rinomina -> dt_create) e solo ts_update come timestamp? Ciò assicurerà che rimanga immutabile una volta impostato.

La mia comprensione è che datetime è per i valori controllati manualmente e il timestamp è un po '"speciale" in quanto MySQL lo manterrà per voi. In questo caso, datetime è quindi una buona scelta per ts_create.

0

Direi che non è necessario avere il CURRENT_TIMESTAMP DEFAULT sul tuo ts_update: se è vuoto, non viene aggiornato, quindi il tuo 'ultimo aggiornamento' è ts_create.

+0

non puoi avere un ON UPDATE TIMESTAMP se hai un altro campo con TIMESTAMP in DEFAULT – Jeger

+0

lo so. Ma la domanda non era "perché questo accade", ma "come posso evitarlo". Questo risponde a questa domanda, credo che sia meglio "cambiare i tipi di dati e fare un trigger". – Nanne

1

Credo che sia possibile utilizzando la tecnica di seguito

`ts_create` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', 
`ts_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 
+0

'0000-00-00 00:00:00' non è un timestamp valido, anche se mysql Permetti, molti altri database non consentono il '' 00:00:00 '' come predefinito per il datatype del timestamp, quindi in un determinato momento, se stai migrando da mysql, questo sarebbe doloroso. – imVJ

+0

Questo è effettivamente doloroso anche in MySQL, non si dovrebbero usare zeri per inizializzare un timestamp o una colonna data/ora. –

3

Si utilizza più vecchia versione di MySQL. Aggiorna il tuo myqsl a 5.6.5+ funzionerà.

+0

Non ha funzionato per me. – AnixPasBesoin

6

Indovina che questo è un vecchio post ma in realtà credo che mysql supporti 2 TIMESTAMP nelle sue recenti edizioni mysql 5.6.25 che è quello che sto usando sin da ora.

0

Questa è la piccola limitazione di Mysql nella versione precedente, in realtà dopo la versione 5.6 e successive multiple timestamp funziona ...

0

si può provare questo ts_create TIMESTAMP DI DEFAULT CURRENT_TIMESTAMP, ts_update TIMESTAMP DI DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP