MySQL 8.0.32创建表时如何设置DATE类型字段默认值?
MySQL DATE字段设置默认当前日期失败的解决方案
问题重现
创建含DATE类型字段并指定CURRENT_DATE为默认值时触发语法错误:
mysql> CREATE TABLE expenses (expense_date DATE DEFAULT CURRENT_DATE); ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'CURRENT_DATE)' at line 1
但TIMESTAMP类型执行相同逻辑却正常:
mysql> CREATE TABLE expenses (expense_timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP); Query OK, 0 rows affected (0.02 sec)
单独调用CURRENT_DATE和CURRENT_TIMESTAMP函数均正常,使用的MySQL版本为8.0.32。
原因说明
这并非MySQL的bug,而是语法规则差异:
CURRENT_TIMESTAMP既是函数名,也是MySQL为TIMESTAMP/DATETIME类型预留的特殊默认值常量,因此可以不带括号使用。- 对于DATE类型,MySQL不支持直接使用
CURRENT_DATE(不带括号)作为默认值,必须显式调用函数形式(带括号),或使用等效的日期函数。
正确解决方案
以下几种写法均可实现DATE字段默认值为当前日期:
- 使用带括号的
CURRENT_DATE()函数
CREATE TABLE expenses (expense_date DATE DEFAULT CURRENT_DATE());
- 使用
CURDATE()函数(与CURRENT_DATE()功能完全等效)
CREATE TABLE expenses (expense_date DATE DEFAULT CURDATE());
- 通过
CAST将CURRENT_TIMESTAMP转换为DATE类型
CREATE TABLE expenses (expense_date DATE DEFAULT CAST(CURRENT_TIMESTAMP AS DATE));
验证效果
创建表后插入一条不指定expense_date的记录:
INSERT INTO expenses VALUES (); SELECT expense_date FROM expenses;
查询结果会自动填充当前日期,符合预期。
内容的提问来源于stack exchange,提问作者Michael Dreisinger
相关产品推荐
相关产品推荐

