我在表users中有两列,即registerDate and lastVisitDate
,它们由datetime数据类型组成。我想做以下几件事。
0000-00-00 00:00:00
,而不是默认使用的null。因为表已经存在并且已经有记录,所以我想使用Modify table。我试过使用下面的两段代码,但都不起作用。
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中将默认日期时间值设置为NOW()?
发布于 2011-04-28 20:16:52
从MySQL 5.6.5开始,您可以使用带有动态默认值的DATETIME
类型:
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
数据类型,该数据类型会在记录被修改时自动更新。然而,不幸的是,每个表只能存在一个自动更新的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
)
发布于 2013-11-16 19:15:46
我使用触发器作为变通方法,将新插入的datetime字段设置为NOW():
CREATE TRIGGER `triggername` BEFORE INSERT ON `tablename`
FOR EACH ROW
SET NEW.datetimefield = NOW()
它应该也适用于更新
Johan & Leonardo的回答涉及到转换为时间戳字段。虽然这对于问题中给出的用例(存储RegisterDate和LastVisitDate)来说可能没问题,但它不是通用的解决方案。参见datetime vs timestamp问题。
发布于 2012-10-25 08:11:54
我的解决方案
ALTER TABLE `table_name` MODIFY COLUMN `column_name` TIMESTAMP NOT
NULL DEFAULT CURRENT_TIMESTAMP;
https://stackoverflow.com/questions/5818423
复制相似问题