一、报错问题

将生产环境现有的表结构导出SQL文件,再导入测试环境库的过程中,出现了一个报错
image.png
> 1067 - Invalid default value for 'return_rate'
报错显示,为return_rate字段设置默认值时,用表达式作为返回的语句不符合预期值。

二、解决方式

去掉表达式前后的单引号即可正常导入。

  1. -- 报错
  2. `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',
  3. -- 正确
  4. `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 子句中 指定的默认值可以是文字常量或表达式。除一个例外,将表达式默认值放在括号内,以将其与文字常量默认值区分开。例子:

  1. CREATE TABLE t1 (
  2. -- literal defaults
  3. i INT DEFAULT 0,
  4. c VARCHAR(10) DEFAULT '',
  5. -- expression defaults
  6. f FLOAT DEFAULT (RAND() * RAND()),
  7. b BINARY(16) DEFAULT (UUID_TO_BIN(UUID())),
  8. d DATE DEFAULT (CURRENT_DATE + INTERVAL 1 YEAR),
  9. p POINT DEFAULT (Point(0,0)),
  10. j JSON DEFAULT (JSON_ARRAY())
  11. );

参考资料: mysql8 参考手册—数据类型默认值