Impostare NOW () come valore predefinito per datetime datetime?

Ho due colonne negli utenti della tabella vale a dire registerDate and lastVisitDate che consistono di tipo di dati datetime. Mi piacerebbe fare quanto segue

  1. Imposta il valore di default registerDate su MySQL NOW ()
  2. Imposta il valore predefinito lastVisitDate su 0000-00-00 00:00:00 Invece di null che utilizza per impostazione predefinita.

Poiché la tabella esiste già e contiene record esistenti, vorrei utilizzare la tabella Modifica. Ho provato a utilizzare i due codici di seguito, ma nessuno dei due funziona.

 ALTER TABLE users MODIFY registerDate datetime DEFAULT NOW() ALTER TABLE users MODIFY registerDate datetime DEFAULT CURRENT_TIMESTAMP; 

Mi dà errore: ERROR 1067 (42000): Invalid default value for 'registerDate'

È ansible per me impostare il valore datetime predefinito su NOW () in MySQL?

A partire da MySQL 5.6.5, è ansible utilizzare il tipo DATETIME con un valore predefinito dinamico:

 CREATE TABLE foo ( creation_time DATETIME DEFAULT CURRENT_TIMESTAMP, modification_time DATETIME ON UPDATE CURRENT_TIMESTAMP ) 

O persino combinare entrambe le regole:

 modification_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 

Riferimento:
http://dev.mysql.com/doc/refman/5.7/en/timestamp-initialization.html
http://optimize-this.blogspot.com/2012/04/datetime-default-now-finally-available.html

Prima di 5.6.5, è necessario utilizzare il tipo di dati TIMESTAMP , che si aggiorna automaticamente ogni volta che il record viene modificato. Sfortunatamente, tuttavia, può esistere solo un campo TIMESTAMP aggiornato automaticamente per tabella.

 CREATE TABLE mytable ( mydate TIMESTAMP ) 

Vedi: http://dev.mysql.com/doc/refman/5.1/en/create-table.html

Se vuoi impedire a MySQL di aggiornare il valore del timestamp su UPDATE (in modo che si attivi solo su INSERT ) puoi cambiare la definizione in:

 CREATE TABLE mytable ( mydate TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) 

Uso un trigger come soluzione alternativa per impostare un campo datetime su NOW () per i nuovi inserimenti:

 CREATE TRIGGER `triggername` BEFORE INSERT ON `tablename` FOR EACH ROW SET NEW.datetimefield = NOW() 

dovrebbe funzionare anche per gli aggiornamenti

Le risposte di Johan & Leonardo prevedono la conversione in un campo di timestamp. Sebbene questo sia probabilmente ok per il caso d’uso presentato nella domanda (memorizzazione di RegisterDate e LastVisitDate), non è una soluzione universale. Vedi domanda datetime vs timestamp .

La mia soluzione

 ALTER TABLE `table_name` MODIFY COLUMN `column_name` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP; 

EUREKA !!!


Per tutti quelli che hanno perso il cuore nel tentativo di impostare un valore DATETIME predefinito in MySQL , so esattamente come ci si sente / si sente. Quindi eccolo qui:

 `ALTER TABLE `table_name` CHANGE `column_name` DATETIME NOT NULL DEFAULT 0 

Osserva attentamente che non ho aggiunto citazioni singole / virgolette doppie attorno allo 0 .


Aggiornamento importante :

Questa risposta è stata postata molto tempo fa. Allora, ha funzionato sulla mia (probabilmente l’ultima) installazione di MySQL e mi sembrava di condividerla. Si prega di leggere i commenti qui sotto prima di decidere di utilizzare questa soluzione ora.

mysql 5.6 documenti dicono che CURRENT_TIMESTAMP può essere utilizzato come predefinito per entrambi i tipi di dati TIMESTAMP e DATETIME:

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

Il modo migliore è creare un trigger:

 /************ ROLE ************/ drop table if exists `role`; create table `role` ( `id_role` bigint(20) unsigned not null auto_increment, `date_created` datetime, `date_deleted` datetime, `name` varchar(35) not null, `description` text, primary key (`id_role`) ) comment=''; drop trigger if exists `role_date_created`; create trigger `role_date_created` before insert on `role` for each row set new.`date_created` = now(); 
 `ALTER TABLE `table_name` CHANGE `column_name` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 

Può essere utilizzato per aggiornare il timestamp durante l’aggiornamento.

Nelle versioni mysql 5.6.5 e successive, è ansible utilizzare datetimes precisi e impostare anche valori predefiniti. Esiste tuttavia un bit sottile, che consiste nel passare il valore di precisione sia alla chiamata di funzione datetime sia a quella NOW ().

Questo esempio funziona:

  ALTER TABLE my_table MODIFY created datetime(6) NOT NULL DEFAULT NOW(6); 

Questo esempio non funziona:

  ALTER TABLE my_table MODIFY created datetime(6) NOT NULL DEFAULT NOW(); 

Non sono sicuro se questo è ancora attivo, ma qui va.

Per quanto riguarda l’impostazione dei valori predefiniti su Now (), non vedo che sia ansible per il tipo di dati DATETIME. Se si desidera utilizzare quel tipo di dati, impostare la data quando si esegue l’inserimento in questo modo:

 INSERT INTO Yourtable (Field1, YourDateField) VALUES('val1', (select now())) 

La mia versione di mySQL è 5.5

Questo ha funzionato per me, usando MySQL:

 ALTER TABLE `table_name` MODIFY `column_name` datetime NOT NULL DEFAULT NOW(); 

Questo ha funzionato per me – ho appena cambiato INSERT in UPDATE per il mio tavolo.

 INSERT INTO Yourtable (Field1, YourDateField) VALUES('val1', (select now())) 
 ALTER TABLE table_name CHANGE COLUMN date_column_name date_column_name DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP; 

Finalmente, questo ha funzionato per me!