MySQL中创建DATE类型字段并设置CURRENT_DATE默认值的问题
解决DATE类型默认值CURRENT_DATE报错的问题
这问题我之前帮不少开发者排查过,核心原因是不同SQL数据库对DATE类型默认值的语法支持有差异——你用DATETIME DEFAULT CURRENT_TIMESTAMP能跑通,是因为这个写法在绝大多数数据库里都通用,但DATE类型的默认值规则就没这么统一了。咱们分主流数据库逐一说明解决方案:
MySQL/MariaDB
如果你用的是MySQL 5.6.5及以上版本,理论上start_date DATE DEFAULT CURRENT_DATE是合法的,但部分旧版本或特殊SQL_MODE配置下可能报错。这时可以试试两种写法:- 用函数形式加括号:
start_date DATE DEFAULT (CURRENT_DATE()) - 用等价的
CURDATE()函数:start_date DATE DEFAULT CURDATE()
另外检查下你的SQL_MODE有没有禁用默认值相关的设置(比如NO_ZERO_DATE),这也可能导致语句失败。
- 用函数形式加括号:
PostgreSQL
PostgreSQL对DATE类型的默认值支持很友好,直接写start_date DATE DEFAULT CURRENT_DATE就完全没问题。如果报错,大概率是语句里有拼写错误或者其他语法问题,比如列定义的位置不对、少了逗号之类的,仔细检查下语句结构就行。SQL Server
SQL Server不支持直接给DATE类型设CURRENT_DATE为默认值,需要把当前时间转换为纯日期类型。推荐两种写法:- 用
GETDATE()转换:start_date DATE DEFAULT CAST(GETDATE() AS DATE) - 用
CURRENT_TIMESTAMP转换:start_date DATE DEFAULT CAST(CURRENT_TIMESTAMP AS DATE)
这两种写法都会自动把当前时间截断为纯日期,不用后续再转换。
- 用
Oracle
Oracle的DATE类型本身会存储时间,但如果你只需要纯日期,可以用TRUNC()函数去掉时间部分:start_date DATE DEFAULT TRUNC(SYSDATE),这样存储的就是当天的0点日期,完全符合你的需求。
先确认自己使用的数据库类型,对应调整语法就能解决问题啦~
内容的提问来源于stack exchange,提问作者Ahsit Tamang
相关产品推荐
相关产品推荐

