我在表用户中有两列,即registerDate and lastVisitDate,它由datetime数据类型组成。我想做以下的事情。
将registerdate默认值设置为mysql now()。
将LastVisitDate默认值设置为0000-00-00 00:00:00,而不是默认使用的空值。
因为该表已经存在并且有现有记录,所以我想使用修改表。我试过使用下面的两段代码,但都不起作用。
它给了我一个错误:ERROR 1067 (42000): Invalid default value for 'registerDate'。
我可以在MySQL中将默认的日期时间值设置为now()吗?
ALTER TABLE users MODIFY dateTime timestamp default CURRENT_TIMESTAMP。在你的两项努力中,你都没有定义领域的data type。
因为mysql 5.6 DATE应该使用默认值NOW()来工作。
根据这个mysql 5.6文档:dev.mysql.com/doc/refman/5.6/en/data-type-defaults.html,您可以使用当前的时间戳()作为默认值。
我如何实现当前的时间戳+1天
从MySQL5.6.5开始,可以使用带有动态默认值的DATETIME类型:
或者甚至结合这两个规则:
号
参考文献: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字段。
请参阅:http://dev.mysql.com/doc/refman/5.1/en/create-table.html
如果要防止mysql更新UPDATE上的时间戳值(这样它只在INSERT上触发),可以将定义更改为:
。
我真的不想使用时间戳。
@易卜拉欣,为什么不呢?,您将ALTER TABLE users MODIFY registerDate datetime DEFAULT CURRENT_TIMESTAMP;声明为问题中的一个明确示例。
@易卜拉欣:时间戳是你唯一的机会。如果使用日期时间字段,则每次都必须使用now()插入记录。
Manual说得很清楚:"例如,这意味着您不能将日期列的默认值设置为函数的值,如now()或当前的日期"。
@Johan DATETIME通常更倾向于选择它所能保持的范围:"1000-01-01 00:00:00"到"9999-12-31 23:59:59",而TIMESTAMPS的"1970-01-01 00:00:00:01"到"2038-01-19 03:14:07"的UTC。用于存储出生日期,或未来30年以上的时间。
也叫ALTER TABLE users MODIFY registerDate TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP;。
更好地链接到手册:dev.mysql.com/doc/refman/5.1/en/timestamp initialization.htm‌&8203;l,其中明确指出,上面的空timestamp列获取"默认当前时间戳"和"更新当前时间戳"行为。
只能有一个时间戳列具有默认的当前时间戳。因此,如果您希望使用两列,例如"创建日期"、"上次编辑",则此解决方案不起作用。
@nickrulez从mysql 5.6开始,这种行为不再局限于timestamp。
插件上的modification_time是什么?会是NULL吗?
我使用触发器作为解决方法,将新插入的日期时间字段设置为now():
CREATE TRIGGER `triggername` BEFORE INSERT ON `tablename`
FOR EACH ROW
SET NEW.datetimefield = NOW()
。
它也应该适用于更新
Johan&Leonardo的答案涉及到转换到时间戳字段。尽管这对于问题中的用例(存储registerdate和lastvisitdate)可能是可以的,但它不是一个通用的解决方案。请参见日期时间与时间戳问题。
这应该是可接受的答案,但具体来说,您应该对其进行编辑,以使其明显地适用于日期时间字段。最初的海报想知道如何为datetime字段解决它,如果您真正了解这两种数据类型之间的区别,那么use a timestamp是一种愚蠢的解决方法。
我的解决方案
。
这个def可以工作,我建议每个人都使用sqlyog或类似的工具,它可以让你在一个简单的界面上完成这些工作。
这仍然是timestamp列的解决方案。没有人要埃多克斯一〔4〕…
是的,这不是问题的答案。时间戳是与日期时间不同的字段类型。
@莱昂纳多我怎么能只显示日期
尤里卡!!!!
对于那些在MySQL中试图设置默认日期时间值而失去信心的人来说,我完全知道你的感受。这里是:
`ALTER TABLE `table_name` CHANGE `column_name` DATETIME NOT NULL DEFAULT 0
仔细观察,我没有在0附近添加单引号/双引号。
重要更新:
这个答案很早就贴出来了。当时,它在我(可能是最新的)MySQL安装中起作用,我想分享它。在决定现在使用此解决方案之前,请阅读下面的注释。
对我很有帮助……)
很高兴我能帮忙!D
这取决于期望…-由于提供了默认值,此解决方案允许您将字段设置为非空。-此解决方案不会将字段设置为now()。
这并不能回答最初的问题;答案应该清楚地说明这一点。
请注意,传统的SQL模式不包括"零日期",因此在这种情况下,上述模式将不起作用。
根据提供的答案,听起来如果不牺牲日期时间作为时间戳,那么必须使用触发器。
这个答案是不对的。"单引号中的0000-00-00 00 00:00:00是非空日期时间字段的"零"等效值,如果可能,应避免使用,原因有很多。如果确实不想使用时间戳,请使用触发器将日期时间自动更新为now()。
这个解决方案将有一些API疯狂的"OMG它的零日期!真是异端!我们无法将"this"转换为java.lang.date/system.datetime!天啊!-崩溃-"。
就像@codereaper说的,这取决于你想做什么。我想把它设置为"0000-00-00 00:00:00",所以这对我来说非常有效,我正在投票。
零日期不是当前时间!P
如果我没记错,这就回答了第二个子问题。
MySQL5.6文档说当前的时间戳可以作为时间戳和日期时间数据类型的默认值:
http://dev.mysql.com/doc/refman/5.6/en/timestamp-initialization.html
正好从5.6.5开始,因为我有5.6.22,如果是5.6,它就不起作用了。太糟糕了。
在MySQL5.6.5及更高版本上,您可以使用精确的日期时间并设置默认值。不过,还有一点很微妙,那就是将精度值传递给datetime和now()函数调用。
此示例有效:
。
此示例不起作用:
号
最好的方法是使用"默认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();
`ALTER TABLE `table_name` CHANGE `column_name`
timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP
可用于在更新时更新时间戳。
号
最后,这对我有用!
这对我很有用,使用mysql:
号
这对我很有效-刚将insert更改为update for my table。
INSERT INTO Yourtable (Field1, YourDateField) VALUES('val1', (select now()))
。
不确定这是否仍然是活动的,但这里是。
关于将默认值设置为now(),我认为对于datetime数据类型来说,这是不可能的。如果要使用该数据类型,请按如下方式设置执行插入操作的日期:
INSERT INTO Yourtable (Field1, YourDateField) VALUES('val1', (select now()))
。
我的MySQL版本是5.5
可以简化为:INSERT INTO Yourtable (Field1, YourDateField) VALUES('val1', NOW())。