MySQL无法给date类型的列设置默认值的解决方法
问题
在MySQL中创建表时一个列的数据类型是date,使用系统自带的curdate()
想设置成当前日期
CREATE TABLE DATE_TEST(
id int,
create_date date default curdate()
)
执行后报错,如下图
将默认值改成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()
);
正常执行
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())
)
此时可以发现没有问题了
使用CURRENT_DATE
也执行正常
插入一条语句试试,可以发现默认值设置成功
参考资料
stackOverFlow上相关问题的讨论
MySQL官方文档 对于默认值的处理