MySQL中使用SYSDATE()作为默认值时出现SQL语法错误求助
这个问题我之前也碰到过,主要是MySQL对默认值函数的支持有版本差异,还有类型匹配的问题,咱们一步步来解决:
为什么你的语句报错?
- 首先,MySQL 8.0之前的版本,只允许
TIMESTAMP/DATETIME类型字段用特定函数(比如CURRENT_TIMESTAMP)作为默认值,DATE字段不支持直接用函数当默认值,这会触发语法错误。 - 其次,
SYSDATE()返回的是DATETIME类型(带时分秒),而你的字段是DATE类型,直接用的话即使语法允许,也可能有类型不兼容的问题。
解决方案分两种情况:
情况1:你用的是MySQL 8.0及以上版本
这个版本已经支持给DATE字段设置函数默认值,只需要确保函数返回的类型和字段匹配就行,推荐用CURDATE()(直接返回当前日期,DATE类型),修正后的建表语句:
CREATE TABLE orders ( id INT PRIMARY KEY NOT NULL AUTO_INCREMENT, odr_date DATE DEFAULT CURDATE() NOT NULL );
如果你一定要用SYSDATE(),可以把它转成DATE类型:
CREATE TABLE orders ( id INT PRIMARY KEY NOT NULL AUTO_INCREMENT, odr_date DATE DEFAULT CAST(SYSDATE() AS DATE) NOT NULL );
情况2:你用的是MySQL 5.7及以下版本
这个版本不支持给DATE字段设置函数默认值,咱们可以用触发器来实现同样的效果:
- 先创建不带默认值的表:
CREATE TABLE orders ( id INT PRIMARY KEY NOT NULL AUTO_INCREMENT, odr_date DATE NOT NULL );
- 创建一个
BEFORE INSERT触发器,当插入数据时如果没指定odr_date,就自动设置为当前日期:
DELIMITER // CREATE TRIGGER set_odr_date_default BEFORE INSERT ON orders FOR EACH ROW BEGIN IF NEW.odr_date IS NULL THEN SET NEW.odr_date = CURDATE(); END IF; END // DELIMITER ;
这样之后插入数据时,只要不手动指定odr_date,触发器就会帮你填上当前日期啦。
内容的提问来源于stack exchange,提问作者HamishD
相关产品推荐
相关产品推荐

