作者:秦福朗
爱可生 DBA 团队成员,负责项目日常问题处理及公司平台问题排查。热爱互联网,会摄影、懂厨艺,不会厨艺的 DBA 不是好司机,didi~
本文来源:原创投稿
*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来>源。
背景
一个业务系统刚迁移完,笔者刚回到家,开发那边就遇到了业务报错”Column ‘create_time’ cannot be null”,从字面意思可以理解为表字段’create_time’想插入null值,但报错该字段不能为null。由此引发了对explicit_defaults_for_timestamp这个有关时间参数的思考。
概念概述
1. TIMESTAMP和DATETIME
提 explicit_defaults_for_timestamp 参数,首先就要简单解释下时间数据类型 TIMESTAMP 和 DATETIME :
- TIMESTAMP 是一个时间戳,范围是’1970-01-01 00:00:01.000000’UTC 到’2038-01-19 03:14:07.999999’UTC。
- DATETIME是日期和时间的组合,范围是’1000-01-01 00:00:00.000000’到 ‘9999-12-31 23:59:59.999999’。
TIMESTAMP 和 DATETIME 列都可以自动初始化并且可以更新为当前的日期和时间,列还可以将当前的时间戳指定为默认值、自动更新的值或者两个同时使用都可以。
2. explicit_defaults_for_timestamp
这个系统变量决定了 MySQL 是否为 TIMESTAMP 列的默认值和 NULL 值的处理启用某些非标准的行为。在 MySQL5.7 的默认情况下,explicit_defaults_for_timestamp 是禁用的,这将启用非标准的行为。在 MySQL8.0 的默认值是开启的。本文默认在 MySQL5.7 场景下。
看场景

业务报错”Column ‘create_time’ cannot be null”,该列不能插入 null 值,查看一下表结构:
#只展示部分时间相关列
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` timestamp NULL DEFAULT NULL COMMENT '更新时间',
可以看到 create_time 列的属性是 not null ,按照惯性思维想,此列不应该插入 null ,为何之前的环境是没有问题的呢?经检查参数发现问题出在 explicit_defaults_for_timestamp 参数上,在迁移前系统没有单独设置该参数值

本文通过一个业务报错案例,深入探讨了MySQL中explicit_defaults_for_timestamp参数对TIMESTAMP列默认值和NULL值的影响。当该参数为OFF时,TIMESTAMP列可自动设置为当前时间戳,而为ON时则不允许插入NULL并遵循严格的行为。通过实验验证了参数在不同设置下的行为差异,强调了参数设置对数据库规范化操作的重要性。
最低0.47元/天 解锁文章
810

被折叠的 条评论
为什么被折叠?



