Caused by: io.r2dbc.spi.R2dbcBadGrammarException: [1067] [42000] Invalid default value for 'sold_at'
问题详解
在执行 schema-mysql.sql 文件的第 22 条 SQL 语句(CREATE TABLE IF NOT EXISTS cdks)时,MySQL 报错 "Invalid default value for 'sold_at'"。
问题出在 cdks 表中这几个 TIMESTAMP 类型的字段:
reserved_at TIMESTAMP COMMENT '预留时间(下单未支付时预留)',
sold_at TIMESTAMP COMMENT '售出时间',
expire_at TIMESTAMP COMMENT '卡密过期时间',
这些 TIMESTAMP 字段没有显式指定 NULL 或 DEFAULT 值。在 MySQL 的严格模式(NO_ZERO_DATE + STRICT_TRANS_TABLES,MySQL 5.7+ 默认开启)下:
第一个 TIMESTAMP 列会自动获得 DEFAULT CURRENT_TIMESTAMP
后续的 TIMESTAMP 列会隐式赋予默认值 '0000-00-00 00:00:00',但这个值在 NO_ZERO_DATE 模式下是不合法的,因此报错
解决方案
将这些可为空的 TIMESTAMP 字段显式声明为 NULL DEFAULT NULL:
reserved_at TIMESTAMP NULL DEFAULT NULL COMMENT '预留时间(下单未支付时预留)',
sold_at TIMESTAMP NULL DEFAULT NULL COMMENT '售出时间',
expire_at TIMESTAMP NULL DEFAULT NULL COMMENT '卡密过期时间',
或者将 TIMESTAMP 改为 DATETIME 类型(DATETIME 没有这个隐式默认值的问题):
reserved_at DATETIME COMMENT '预留时间(下单未支付时预留)',
sold_at DATETIME COMMENT '售出时间',
expire_at DATETIME COMMENT '卡密过期时间',
修改 schema-mysql.sql 中 cdks 表对应的字段定义后,重新启动即可。