将NOW()设置为datetime数据types的默认值?

我在表用户中有两列,分别是由datetime数据types组成的registerDate and lastVisitDate 。 我想做以下事情。

  1. 设置registerDate默认值为MySQL NOW()
  2. 将lastVisitDate默认值设置为0000-00-00 00:00:00而不是默认使用的null。

由于该表已经存在,并有现有的logging,我想使用修改表。 我试过使用下面的两段代码,但都不起作用。

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

它给了我错误: ERROR 1067 (42000): Invalid default value for 'registerDate'

是否有可能在MySQL中设置默认的date时间值为NOW()?

从MySQL 5.6.5开始,可以使用具有dynamic默认值的DATETIMEtypes:

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

甚至结合这两个规则:

 modification_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 

参考:
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

在5.6.5之前,你需要使用TIMESTAMP数据types,当logging被修改时它会自动更新。 不幸的是,每个表只能存在一个自动更新的TIMESTAMP字段。

 CREATE TABLE mytable ( mydate TIMESTAMP ) 

请参阅: http : //dev.mysql.com/doc/refman/5.1/en/create-table.html

如果要防止MySQL更新UPDATE上的时间戳值(因此它只在INSERT触发),则可以将定义更改为:

 CREATE TABLE mytable ( mydate TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) 

我使用触发器作为解决方法将datetime字段设置为NOW()以便插入新内容:

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

它也应该更新

Johan&Leonardo的答案涉及转换为时间戳字段。 虽然这可能是问题中提出的用例(存储RegisterDate和LastVisitDate),但这不是一个通用的解决scheme。 请参阅datetime vs timestamp问题。

我的解决scheme

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

EUREKA!


对于所有那些试图在MySQL中设置默认的DATETIME值的人来说 ,我完全知道你的感受/感受。 所以这里是:

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

仔细观察, 我没有0周围加单引号/双引号


重要更新

这个答案是很久以前发布的。 那时候,它在我的(可能是最新的)安装MySQL上工作,我觉得分享它。 在您决定现在使用此解决scheme之前,请阅读下面的注释。

mysql 5.6文档说CURRENT_TIMESTAMP可以用作TIMESTAMP和DATETIME数据types的默认值:

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

在MySQL 5.6.5及更新版本上,您可以使用精确的date时间并设置默认值。 有一个微妙的一点,即将精度值传递给datetime和NOW()函数调用。

这个例子工作:

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

此示例不起作用:

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

最好的办法是做个触发器:

 /************ 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 

可以用来更新更新的时间戳。

不知道这是否仍然活跃,但在这里。

关于将默认值设置为Now(),我不认为DATETIME数据types是可能的。 如果要使用该数据types,请在执行插入操作时设置date,如下所示:

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

我的MySQL版本是5.5

这对我来说,使用MySQL:

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