问题

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

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


执行后报错,如下图

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

将默认值改成​ ​CURRENT_DATE​ ​还是报同样的错误

解决方法

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

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

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

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


正常执行

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

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


MySQL无法给date类型的列设置默认值的解决方法_参考资料_03

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

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

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


此时可以发现没有问题了

MySQL无法给date类型的列设置默认值的解决方法_参考资料_04

使用​ ​CURRENT_DATE​ ​也执行正常

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

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

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