MySQL 5.5升级至5.6/5.7时NOT NULL插入行为异常问题咨询
嘿,这个问题本质是MySQL 5.6及以后版本默认SQL模式的严格化调整导致的,我来给你拆解清楚:
为什么5.5能正常运行?
在MySQL 5.5中,默认的SQL模式比较宽松,当你执行insert into null_test values();时,虽然not_null字段设置了NOT NULL,但数据库会隐式填充一个默认值(对于VARCHAR类型来说是空字符串''),不会触发错误。
5.6/5.7为什么报错?
从MySQL 5.6开始,默认启用了严格模式(比如STRICT_TRANS_TABLES),当你尝试向NOT NULL字段插入无值(或隐式NULL)时,会触发ER_NO_DEFAULT_FOR_FIELD错误——严格模式下不允许数据库自动填充未定义的默认值,必须显式指定有效值,或者字段本身有明确的默认值。
而你提到的insert into null_test values(NULL);报错是符合预期的,因为这是显式插入NULL,直接违反了NOT NULL约束,不管哪个版本都会报错。
验证当前SQL模式
你可以通过这条命令查看当前的SQL模式:
SELECT @@sql_mode;
对比5.5和5.6/5.7的结果,会发现后者默认包含了STRICT_TRANS_TABLES这类严格模式相关的参数。
解决办法(按推荐度排序)
方案1:显式插入有效值
最规范的做法是插入时明确提供符合要求的值,比如:insert into null_test values(''); -- 插入空字符串,符合NOT NULL约束方案2:给字段添加默认值
如果业务允许,可以修改表结构,给not_null字段设置默认值:ALTER TABLE null_test MODIFY COLUMN not_null VARCHAR(255) NOT NULL DEFAULT '';这样再执行
insert into null_test values();时,数据库会自动使用你设置的默认值,不会报错。方案3:调整SQL模式(不推荐)
如果你必须保持5.5的宽松行为,可以修改SQL模式,移除严格相关的参数。比如在配置文件(my.cnf/my.ini)中设置:sql_mode=NO_ENGINE_SUBSTITUTION然后重启MySQL服务。但不建议这么做,因为严格模式能帮你提前发现很多数据一致性问题。
内容的提问来源于stack exchange,提问作者Jigar Patel

