背景
项目需要升级MySQL版本,打算5.6升5.7,升级后发现原本正常的部分SQL,不能正常工作。
字段定义为
created_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
在之前的使用中,有的同事代码不规范,向此字段插入时,会直接插入null,而非不更新此字段的值
如下为错误写法:
INSERT INTO demo_table(name, email, created_time) VALUES ('alice', 'alice@gmail.com', null)
如下为正确写法:
INSERT INTO demo_table(name, email) VALUES ('alice', 'alice@gmail.com')
原因及解决方案
在MySQL5.6版本中,插入null,可自动填入默认值CURRENT_TIMESTAMP
,而MySQL5.7的默认行为不一样,会直接报错cannot be null Column 'created_time'
解决方案:MySQL5.7引入了一个配置:explicit_defaults_for_timestamp
, 默认是OFF
,改为ON
即可