我在表用户中有两列,即registerDate和lastVisitDate,它们由datetime数据类型组成。我想做以下事情。

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

因为该表已经存在,并且有已有的记录,所以我想使用修改表。我尝试使用下面的两段代码,但都不起作用。

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

它给我错误:错误1067(42000):无效的默认值为'registerDate'

我是否可以在MySQL中设置默认的日期时间值为NOW() ?


当前回答

在mysql 5.6.5及更新版本上,您可以使用精确的日期时间并设置默认值。但是有一点很微妙,那就是将精度值传递给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();

其他回答

CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `dateCreated` datetime DEFAULT CURRENT_TIMESTAMP,
  `dateUpdated` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `mobile_UNIQUE` (`mobile`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

尤里卡! !


对于那些试图在MySQL中设置默认DATETIME值而失去信心的人,我确切地知道你的感受。就是这样:

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

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


重要更新:

这个答案是很久以前贴出来的。当时,它在我的MySQL安装(可能是最新的)上运行,我想分享一下。在您决定使用此解决方案之前,请阅读下面的评论。

mysql 5.6文档说CURRENT_TIMESTAMP可以作为TIMESTAMP和DATETIME数据类型的默认值:

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

在mysql 5.6.5及更新版本上,您可以使用精确的日期时间并设置默认值。但是有一点很微妙,那就是将精度值传递给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();

我的解决方案

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