Mysql 是否将NOW()设置为datetime数据类型的默认值?
我在表users中有两列,即Mysql 是否将NOW()设置为datetime数据类型的默认值?,mysql,sql,datetime,mysql-error-1067,Mysql,Sql,Datetime,Mysql Error 1067,我在表users中有两列,即registerDate和lastVisitDate,它们由日期时间数据类型组成。我想做以下几点 将registerDate默认值设置为MySQL NOW() 将lastVisitDate默认值设置为0000-00-00:00:00,而不是默认使用的null 因为该表已经存在并且有现有记录,所以我想使用Modify table。我尝试过使用下面的两段代码,但两段代码都不起作用 ALTER TABLE users MODIFY registerDate datetime
registerDate和lastVisitDate
,它们由日期时间数据类型组成。我想做以下几点
0000-00-00:00:00
,而不是默认使用的nullALTER TABLE users MODIFY registerDate datetime DEFAULT NOW()
ALTER TABLE users MODIFY registerDate datetime DEFAULT CURRENT_TIMESTAMP;
它给了我错误:Error 1067(42000):“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
参考资料:在5.6.5之前,您需要使用
时间戳
数据类型,该数据类型在记录被修改时自动更新。然而,不幸的是,每个表只能存在一个自动更新的时间戳
字段
CREATE TABLE mytable (
mydate TIMESTAMP
)
见:
如果要防止MySQL在UPDATE
上更新时间戳值(这样它只在INSERT
上触发),可以将定义更改为:
CREATE TABLE mytable (
mydate TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
尤里卡强>
对于那些试图在MySQL中设置默认日期时间值的人来说,我非常清楚你的感受。这就是:
`ALTER TABLE `table_name` CHANGE `column_name` DATETIME NOT NULL DEFAULT 0
仔细观察我没有在0周围添加单引号/双引号
重要更新:
这个答案很久以前就公布了。当时,它在我(可能是最新)安装的MySQL上工作,我很想分享它。在决定现在使用此解决方案之前,请阅读下面的评论。不确定此解决方案是否仍处于活动状态,但现在开始 关于将默认值设置为Now(),我认为DATETIME数据类型不可能这样。如果要使用该数据类型,请按如下方式设置执行插入的日期:
INSERT INTO Yourtable (Field1, YourDateField) VALUES('val1', (select now()))
INSERT INTO Yourtable (Field1, YourDateField) VALUES('val1', (select now()))
我的mySQL版本是5.5我的解决方案
ALTER TABLE `table_name` MODIFY COLUMN `column_name` TIMESTAMP NOT
NULL DEFAULT CURRENT_TIMESTAMP;
可用于在更新时更新时间戳。我使用触发器作为解决方法,将datetime字段设置为NOW(),以用于新插入:
CREATE TRIGGER `triggername` BEFORE INSERT ON `tablename`
FOR EACH ROW
SET NEW.datetimefield = NOW()
它应该也适用于更新
Johan&Leonardo的答案涉及转换为时间戳字段。尽管这对于问题中提出的用例(存储RegisterDate和LastVisitDate)来说可能还可以,但它不是一个通用的解决方案。请参阅问题。最好的方法是使用“默认0”。
其他方式:
/**********角色************/
如果存在“角色”,则删除表;
创建表“角色”(
`id_role`bigint(20)无符号非空自动增量,
`date_created`datetime,
`date_deleted`datetime,
`name`varchar(35)不为空,
`说明`正文,
主键(`id\u role`)
)评论=“”;
如果存在“角色\u创建日期”,则删除触发器;
在插入之前创建触发器“角色\创建日期”
关于`角色`
每行
设置新。`date_created`=now();
mysql 5.6文档说,当前时间戳可以用作时间戳和日期时间数据类型的默认值:
在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();
这对我来说很有效,使用MySQL:
ALTER TABLE `table_name` MODIFY `column_name` datetime NOT NULL DEFAULT NOW();
这对我很有用-只是将INSERT更改为更新我的表
终于,我成功了 我真的不想使用时间戳。@Ibrahim:时间戳是你唯一的机会。如果使用datetime字段,则每次都必须使用now()插入记录。Manual说得很清楚:“例如,这意味着您不能将日期列的默认值设置为函数的值,例如now()或CURRENT_date”与时间戳相比,@Johan
DATETIME
通常更倾向于选择它能容纳的范围:“1000-01-01 00:00:00”到“9999-12-31 23:59:59”,而时间戳则是从UTC的“1970-01-01 00:00:01”到UTC的“2038-01-19 03:14:07”。为了存储出生日期或未来30年以上的数据。@nickrulez从MySQL 5.6开始,对于这种行为,您不再被限制为时间戳
。ALTER TABLE users MODIFY dateTime timestamp default CURRENT timestamp。您没有在MySQL 5.6中定义数据类型
字段。MySQL 5.6日期
应使用默认值NOW()
根据此MySQL 5.6文档:,您可以使用当前时间戳()作为默认值。如何实现当前时间戳+1天可以简化为:插入到您的表中(Field1,YourDateField)值('val1',NOW())
这取决于期望值…-此解决方案允许字段不为NULL,因为提供了默认值。-此解决方案不会将字段设置为NOW()。这并没有回答最初的问题;答案应该清楚地说明这一点。请注意,传统的SQL模式包含NO_ZERO_DATE,因此在这种情况下上述方法将不起作用。根据提供的答案,听起来如果您不想牺牲DATETIME作为时间戳,那么您必须使用触发器。此解决方案将有一些API“天哪,这是零日期!多么异端!我们不能将‘this’转换为java.lang.date/System.DateTime!天哪!-崩溃——”。这个定义很有效,我建议每个人都使用SQLYG或类似的工具,它可以让你在一个简单的界面上完成这项工作。这仍然是时间戳
列的解决方案。没有人要求时间戳
。。是的,这不是问题的答案。时间戳与DATETIME是不同类型的字段。@Leonardo我如何显示只有日期这应该是公认的答案,但特别是
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;
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;