将NOW()设置为datetime数据types的默认值?
我在表用户中有两列,分别是由datetime数据types组成的registerDate and lastVisitDate
。 我想做以下事情。
- 设置registerDate默认值为MySQL NOW()
- 将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默认值的DATETIME
types:
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();