一、报错问题
将生产环境现有的表结构导出SQL文件,再导入测试环境库的过程中,出现了一个报错
> 1067 - Invalid default value for 'return_rate'
报错显示,为return_rate字段设置默认值时,用表达式作为返回的语句不符合预期值。
二、解决方式
去掉表达式前后的单引号即可正常导入。
-- 报错
`return_rate` float NULL DEFAULT '(case when (`betting_amount` = 0) then 0.00 when (`betting_amount` <> 0) then (`grant_amount` / `betting_amount`) end)' COMMENT '返奖率\n',
-- 正确
`return_rate` float NULL DEFAULT (case when (`betting_amount` = 0) then 0.00 when (`betting_amount` <> 0) then (`grant_amount` / `betting_amount`) end) COMMENT '返奖率\n',
三、原理
从MySQL 8.0.13开始的显式默认值的处理。
DEFAULT 子句中 指定的默认值可以是文字常量或表达式。除一个例外,将表达式默认值放在括号内,以将其与文字常量默认值区分开。例子:
CREATE TABLE t1 (
-- literal defaults
i INT DEFAULT 0,
c VARCHAR(10) DEFAULT '',
-- expression defaults
f FLOAT DEFAULT (RAND() * RAND()),
b BINARY(16) DEFAULT (UUID_TO_BIN(UUID())),
d DATE DEFAULT (CURRENT_DATE + INTERVAL 1 YEAR),
p POINT DEFAULT (Point(0,0)),
j JSON DEFAULT (JSON_ARRAY())
);
参考资料: mysql8 参考手册—数据类型默认值