>我在表用户中有两列,即registerDate and lastVisitDate
由日期时间数据类型组成。我想做以下几点。
- 将注册日期默认值设置为 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;
它给了我错误:ERROR 1067 (42000): Invalid default value for 'registerDate'
我可以在 MySQL 中将默认日期时间值设置为 NOW(( 吗?
从 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.htmlhttp://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
)
我使用触发器作为解决方法,为新插入设置日期时间字段为 NOW((:
CREATE TRIGGER `triggername` BEFORE INSERT ON `tablename`
FOR EACH ROW
SET NEW.datetimefield = NOW()
它也应该适用于更新
Johan & Leonardo 的答案涉及转换为时间戳字段。尽管这对于问题中提出的用例(存储RegisterDate和LastVisitDate(来说可能是可以的,但它不是一个通用的解决方案。请参阅日期时间与时间戳问题。
我的解决方案
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安装,我想分享它。在您决定立即使用此解决方案之前,请阅读下面的评论。
在 mysql 5.6.5 及更高版本上,您可以使用精确的日期时间并设置默认值。 不过有一个微妙的位,即将精度值传递给日期时间和 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();
mysql 5.6 文档说CURRENT_TIMESTAMP可以用作 TIMESTAMP 和 DATETIME 数据类型的默认值:
http://dev.mysql.com/doc/refman/5.6/en/timestamp-initialization.html
`ALTER TABLE `table_name` CHANGE `column_name`
timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP
可用于在更新时更新时间戳。
最好的方法是使用"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();
这对我来说很有用,使用 MySQL:
ALTER TABLE `table_name` MODIFY `column_name` datetime NOT NULL DEFAULT NOW();
ALTER TABLE table_name
CHANGE COLUMN date_column_name date_column_name DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP;
最后,这对我有用!
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;
不确定这是否仍然有效,但在这里。
关于将默认值设置为 Now((,我认为 DATETIME 数据类型不可能这样做。如果要使用该数据类型,请按如下所示设置执行插入的日期:
INSERT INTO Yourtable (Field1, YourDateField) VALUES('val1', (select now()))
我的 mySQL 版本是 5.5
这对我有用 - 只是将我的表的插入更改为更新。
INSERT INTO Yourtable (Field1, YourDateField) VALUES('val1', (select now()))