我在表用户中有两列,即registerDate and lastVisitDate
,它们由日期时间数据类型组成。我想做以下几点。
0000-00-00 00:00:00
而不是默认使用的null。因为该表已经存在并且有现有记录,所以我想使用Modify表。我尝试过使用下面的两段代码,但都不行。
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()吗?
答案 0 :(得分:227)
从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
)
答案 1 :(得分:70)
我使用触发器作为解决方法,为新插入设置日期时间字段为NOW():
CREATE TRIGGER `triggername` BEFORE INSERT ON `tablename`
FOR EACH ROW
SET NEW.datetimefield = NOW()
它也适用于更新
Johan&莱昂纳多涉及转换为时间戳字段。虽然这可能对问题中提供的用例(存储RegisterDate和LastVisitDate)没有问题,但它不是一个通用的解决方案。请参阅datetime vs timestamp问题。
答案 2 :(得分:42)
我的解决方案
ALTER TABLE `table_name` MODIFY COLUMN `column_name` TIMESTAMP NOT
NULL DEFAULT CURRENT_TIMESTAMP;
答案 3 :(得分:13)
对于那些在MySQL中设置默认DATETIME值的人,我确切地知道你的感受/感受。所以这就是:
`ALTER TABLE `table_name` CHANGE `column_name` DATETIME NOT NULL DEFAULT 0
仔细观察我没有在 0 附近添加单引号/双引号。
重要更新:
这个答案很久以前发布了。那时候,它适用于我的(可能是最新的)MySQL安装,我感觉就像分享它一样。在您决定立即使用此解决方案之前,请阅读以下评论。
答案 4 :(得分:4)
mysql 5.6 docs说CURRENT_TIMESTAMP可以用作TIMESTAMP和DATETIME数据类型的默认值:
http://dev.mysql.com/doc/refman/5.6/en/timestamp-initialization.html
答案 5 :(得分:3)
在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();
答案 6 :(得分:1)
`ALTER TABLE `table_name` CHANGE `column_name`
timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP
可用于更新更新时的时间戳。
答案 7 :(得分:1)
最好的方法是使用" DEFAULT 0"。 其他方式:
/************ 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();
答案 8 :(得分:0)
这对我有用,使用MySQL:
cv::Ptr
答案 9 :(得分:0)
ALTER TABLE table_name
CHANGE COLUMN date_column_name date_column_name DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP;
最后,这对我有用!
答案 10 :(得分:0)
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;
答案 11 :(得分:-1)
不确定这是否仍然有效,但此处仍然存在。
关于将默认值设置为Now(),我认为DATETIME数据类型不可能。如果要使用该数据类型,请在执行插入时设置日期:
INSERT INTO Yourtable (Field1, YourDateField) VALUES('val1', (select now()))
我的mySQL版本是5.5