将DATE类型列的默认值设置为当前日期而不包含时间部分?
将DATE类型列的默认值设置为当前日期而不包含时间部分?
注意:问题是关于DATE类型,而不是Datetime或Timestamp类型。
如何将日期数据类型的列改为默认使用当前日期?
我看到了很多关于datetime(带有时间部分)的示例,但没有关于date的。我尝试过:
ALTER TABLE `accounting` ALTER `accounting_date`
SET DEFAULT CURRENT_DATE;
ALTER TABLE `accounting` CHANGE `accounting_date`
`accounting_date` DATE NOT NULL DEFAULT CURRENT_DATE;
我还尝试过使用CURDATE()、NOW()、CURRENT_DATE()...
在MySQL中,可能无法为'date'数据类型设置默认值。您需要将类型更改为timestamp或datetime。
您可以看一下这个类似的问题。
Invalid default value for 'Date'
编辑:
在5.6.5版本中,可以在datetime列上设置默认值,甚至可以创建一个在更新行时更新的列。类型定义:
CREATE TABLE foo ( `creation_time` DATETIME DEFAULT CURRENT_TIMESTAMP, `modification_time` DATETIME ON UPDATE CURRENT_TIMESTAMP )
参考:http://optimize-this.blogspot.com/2012/04/datetime-default-now-finally-available.html
他明确说了Date,而不是Datetime。
问题的原因是在MySQL 8.0+版本中,想要将DATE类型列的默认值设置为当前日期,但是不包含时间部分。解决方法是使用DATE_FORMAT函数对NOW()函数的输出进行格式化,以去除时间部分。
具体的解决方法如下所示:
CREATE TABLE foo ( `creation_time` DATE DEFAULT (DATE_FORMAT(NOW(), '%Y-%m-%d')) )
某些情况下为什么在保存时要使用格式化。实际上,格式化通常是在输出值时使用的,而不是在保存时。然而,NOW()函数也会输出一个值。在这个意义上,DATE_FORMAT()和NOW()以及其他输出值的函数并没有太大的区别。DATE类型接受格式为Y-m-d的字符串或DATE对象;而NOW()输出的是DATETIME对象,其字符串表示包含时间部分。虽然有很多其他方法可以实现这个目的,但在这种情况下,我们的做法是将创建时间的默认值设置为此刻的日期部分。基本上,我们去掉NOW()输出的时间部分,创建一个Y-m-d格式的字符串,并将其设置为creation_time的值。
某些情况下在你的例子中使用DATE_FORMAT函数是多余的,甚至还会影响性能。你可以只使用NOW()而不进行格式化,它会以相同的输出工作。
某些情况下NOW()对我来说一直在出错,也许我还犯了其他我不知道的错误...已经过了一段时间,我不记得当时具体出了什么问题。然而,由于那次的经历,我当时使用了上述语句作为一个解决方法。尽管如此,你对性能的担忧是正确的,特别是对于高INSERT负载,DATE_FORMAT()是多余的。另外,是的,我刚刚尝试过,只使用NOW()也可以正常工作。