MySQL无法给date类型的列设置默认值的解决方法


问题

在MySQL中创建表时一个列的数据类型是date,使用系统自带的curdate()想设置成当前日期

CREATE TABLE DATE_TEST(
  id int,
  create_date date default curdate()
)

执行后报错,如下图
错误1
将默认值改成CURRENT_DATE还是报同样的错误

解决方法

语句之所以会报错,是因为在MySQL中default后只能是一个常量,而不能是一个表达式,如果必须要使用表达式则应该将该表达式整个用小括号包括起来

  • 方法一 将数据类型换成datetimetimestamp,然后使用now()CURRENT_TIMESTAMP作为默认值

前面说default后只能接常量,但是有一个例外就是如果数据类型是datetimetimestamp,那么后面可以接一个对应的时间函数,也就是now()CURRENT_TIMESTAMP(这两个是等价的),如下面语句

CREATE TABLE DATE_TEST(
  id int,
  create_time datetime default now()
);

正常执行

CREATE TABLE DATE_TEST(
  id int,
  create_time timestamp default CURRENT_TIMESTAMP
);

  • 方法二 将default后的函数用括号包起来

如果硬要使用date类型,则需要将后面的表达式curdate()或者CURRENT_DATE用括号包起来

CREATE TABLE DATE_TEST(
  id int,
  create_date date default (curdate())
)

此时可以发现没有问题了
使用curdate()函数

使用CURRENT_DATE也执行正常
使用CURRENT_DATE

插入一条语句试试,可以发现默认值设置成功
验证

参考资料

stackOverFlow上相关问题的讨论
MySQL官方文档 对于默认值的处理

与此问题相关的延伸阅读

MySQL官方文档 时间数据类型
MySQL官方文档 时间类型相关函数


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM