2012-10-14 10 views
12

ho visto un sacco di questioni connesse, ma non posso mettere il mio dito su questo specifico argomento:MySQL non sta permettendo ON UPDATE CURRENT_TIMESTAMP per un campo DATETIME

Ho una tabella di MySQL sia con un TIMESTAMP (per quando il campo è stato creato) e un DATETIME (per ogni volta che il campo viene aggiornato). Ecco come si presenta:

CREATE TABLE 'vis' (
ID BIGINT PRIMARY KEY AUTO_INCREMENT NOT NULL, 
ENTRY VARCHAR(255), 
AUTHOR VARCHAR(255), 
CREATED_AT TIMESTAMP DEFAULT CURRENT_TIMESTAMP, 
UPDATED_AT DATETIME ON UPDATE CURRENT_TIMESTAMP, 
UPDATED_BY VARCHAR(255) 
) 

Quando provo questo, però, l'errore che sto ottenendo è: (SQL Error: 1294 SQL State: HY000) - Invalid ON UPDATE clause for 'updated_at' field

Ovunque ho letto (anche su Stack Overflow) suggerisce dovrei essere in grado di fare questo, ma Sto ottenendo questo errore. Forse c'è un altro modo per avere un campo che aggiorna automaticamente l'ora ogni volta che lo aggiorno?

Sto usando MySQL Server 5.5.

risposta

20

DATETIME non è possibile utilizzare CURRENT_TIMESTAMP durante l'aggiornamento. Invece, cambiarlo in un TIMESTAMP.

Oppure, considerare l'utilizzo di un trigger per questa situazione: http://dev.mysql.com/doc/refman/5.0/en/trigger-syntax.html

EDIT: Come nei commenti (grazie @ АлександрФишер!), Questo non è più il caso, poiché MySQL 5.6.5, quindi un'altra soluzione è di aggiornare il tuo server, se possibile.

+2

Questo ha funzionato perfettamente, grazie! Mi sono sbarazzato di 'ON UPDATE CURRENT TIMESTAMP' sulla dichiarazione della tabella, e poi ho elaborato questa sintassi dopo aver creato la tabella:' CREATE TRIGGER 'vis_update_entry' PRIMA DI AGGIORNAMENTO 'vis' FOR EACH ROW SET NEW.updated_at = CURRENT_TIMESTAMP' E ora si aggiorna ogni volta che aggiorno quella particolare riga. Morale della storia: ** Ovunque online che dice che puoi fare due TIMESTAMPS o DATETIME con ON UPDATE è FALSO! ** Almeno per MySQL Server 5.5. –

+3

@MichaelPlautz - sempre bello vedere un "grazie, l'ho risolto con la tua risorsa" piuttosto che "ok ma ho bisogno del codice per farlo su un trigger", grazie :) – slugonamission

+2

La versione usata sembra essere molto importante. La documentazione dice che funzionerà se si utilizza MySQL versione 5.6: http://dev.mysql.com/doc/refman/5.6/en/timestamp-initialization.html. Non posso confermare perché il mio server funziona con 5.1 :( –

0

Sì, e se si cambia a data e ora, né con né DEFAULT CURRENT_TIMESTAMPON UPDATE CURRENT_TIMESTAMP, è la stessa di specificare sia DEFAULT CURRENT_TIMESTAMP e ON UPDATE CURRENT_TIMESTAMP.

+0

Si prega di chiarire: senza alcun modificatore, impostazioni predefinite e aggiornamenti automatici? –

1

MySQL non permettere funzioni da utilizzare per predefinite DateTime valori. (Vedere il tipo di dati MySQL

5

Questa funzione sembra essere stata introdotta in 5.6. Funziona come previsto sulla mia installazione OS X predefinita.

Riferimento: Automatic Timestamp Properties Before MySQL 5.6.5

+2

http://dev.mysql.com/doc/refman/5.6/en/timestamp-initialization.html – Jeff

0

di inserimento e aggiornamento data/ora automaticamente

Compatibile con tipo di dati: DATETIME o TIMESTAMP

Testato su: MySQL 5.6.27-2 e MariaDB 10.1.10


Memorizza la data e l'ora correnti nel INSERT

CREATE TABLE table_demo (
    ... 
    `CreatedAt` datetime DEFAULT CURRENT_TIMESTAMP 
    ... 
); 

Memorizza la data e l'ora correnti nel INSERT e UPDATE

CREATE TABLE table_demo (
    ... 
    `UpdatedAt` datetime EFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 
    ... 
); 

Memorizza la data e l'unica volta corrente in UPDATE

NOTA: quando INSERT il valore predefinito è ' 0000-00-00 00:00:00

CREATE TABLE table_demo (
    ... 
    `UpdatedAt` datetime DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP 
    ... 
); 
0

Guarda la mia foto.

Set colonna Tipo Archiviato timestamp, Attributi su Aggiornamento CURRENT_TIMESTAMP & Extra anche. Nessun problema dopo aver cambiato il tipo archiviato nel Database, nel mio caso. Ma non sono sicuro per tutti i casi. enter image description here