Definir NOW () como valor padrão para o tipo de dados datetime?

Eu tenho duas colunas em usuários de tabela ou seja, registerDate and lastVisitDate que consistem em tipo de dados datetime. Eu gostaria de fazer o seguinte.

  1. Defina o valor defaults registerDate como MySQL NOW ()
  2. Definir o valor padrão lastVisitDate para 0000-00-00 00:00:00 Em vez de null, que é usado por padrão.

Como a tabela já existe e possui registros existentes, gostaria de usar a tabela Modify. Eu tentei usar o código abaixo, mas nenhum dos dois funciona.

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

Isso me dá Error: ERROR 1067 (42000): Invalid default value for 'registerDate'

É possível para mim definir o valor de data e hora padrão como NOW () no MySQL?

No MySQL 5.6.5, você pode usar o tipo DATETIME com um valor padrão dynamic:

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

Ou até combinar as duas regras:

 modification_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 

Referência:
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

Antes de 5.6.5, você precisa usar o tipo de dados TIMESTAMP , que é atualizado automaticamente sempre que o registro é modificado. Infelizmente, no entanto, apenas um campo TIMESTAMP auto-atualizado pode existir por tabela.

 CREATE TABLE mytable ( mydate TIMESTAMP ) 

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

Se você quiser impedir que o MySQL atualize o valor de registro de data e hora em UPDATE (para que ele seja acionado somente em INSERT ), você pode alterar a definição para:

 CREATE TABLE mytable ( mydate TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) 

Eu uso um gatilho como uma solução alternativa para definir um campo de data e hora para NOW () para novas inserções:

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

ele deve funcionar para atualizações também

As respostas de Johan e Leonardo envolvem a conversão para um campo de registro de data e hora. Embora isso seja provavelmente ok para o caso de uso apresentado na pergunta (armazenar RegisterDate e LastVisitDate), não é uma solução universal. Veja a pergunta datetime vs timestamp .

Minha solução

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

EUREKA !!!


Para todos aqueles que perderam o coração tentando definir um valor DATETIME padrão no MySQL , eu sei exatamente como você se sente / sente. Então aqui está:

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

Observe cuidadosamente que eu não adicionei aspas simples / aspas duplas em torno do 0 .


Atualização importante :

Essa resposta foi postada há muito tempo. Naquela época, funcionou na minha (provavelmente mais recente) instalação do MySQL e eu senti vontade de compartilhá-lo. Por favor, leia os comentários abaixo antes de decidir usar esta solução agora.

As documentações do mysql 5.6 dizem que CURRENT_TIMESTAMP pode ser usado como padrão para os tipos de dados TIMESTAMP e DATETIME:

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

A melhor maneira é fazer um 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 

Pode ser usado para atualizar o registro de data e hora na atualização.

Nas versões mysql 5.6.5 e mais recentes, você pode usar datetimes precisos e definir valores padrão também. Há um pouco sutil, porém, que é passar o valor de precisão para a chamada de function datetime e NOW ().

Este exemplo funciona:

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

Este exemplo não funciona:

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

Não tenho certeza se isso ainda está ativo, mas aqui vai.

Em relação à configuração dos padrões como Now (), não vejo que isso seja possível para o tipo de dados DATETIME. Se você quiser usar esse tipo de dados, defina a data quando você executar a inserção assim:

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

Minha versão do mySQL é 5.5

Isso funcionou para mim, usando o MySQL:

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

Isso funcionou para mim – apenas mudou INSERT para UPDATE para minha mesa.

 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, isso funcionou para mim!