MySQL 5.6升级8.0疑问:插入是否需指定所有non-null无默认值列?
MySQL无默认值NOT NULL列插入行为解析
核心结论
是的,插入数据时必须显式指定所有无默认值的NOT NULL列的值——但实际行为取决于MySQL的SQL模式配置,这正是你测试环境与官方文档描述不一致的原因。
差异原因
MySQL的SQL模式决定了它对不规范SQL的处理逻辑:
- 严格模式(STRICT_TRANS_TABLES/STRICT_ALL_TABLES):这是官方文档描述的标准行为,插入未指定无默认值NOT NULL列的行时,直接抛出错误,语句执行失败,不会插入任何数据。
- 非严格模式:MySQL会自动为未指定的列填充隐式默认值(数值类型填0、字符串类型填空串、日期类型填零日期),仅抛出警告,语句执行成功并插入数据。这种模式在旧版本MySQL(如5.6)的部分默认配置中可能存在。
升级到MySQL 8.0的关键注意点
MySQL 8.0默认启用STRICT_TRANS_TABLES严格模式,升级后你测试环境中的这类插入语句会直接报错,而非仅警告。建议提前处理:
- 为无默认值的NOT NULL列补充合理业务默认值(若允许)
- 修正所有插入语句,确保显式指定所有无默认值NOT NULL列的值
- 若临时无法修改代码或表结构,可临时关闭严格模式,但这只是权宜之计,长期会带来数据一致性风险
查看当前SQL模式
执行以下SQL确认当前配置:
SELECT @@sql_mode;
结果中包含STRICT_TRANS_TABLES或STRICT_ALL_TABLES则为严格模式,否则为非严格模式。
内容的提问来源于stack exchange,提问作者janosdupai
相关产品推荐
相关产品推荐

