关于timestamp null值问题 explicit_defaults_for_timestamp

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。

  • 【TiDB 版本】:4.0.6
  • 【问题描述】:

官方文档对于此参数的描述
explicit_defaults_for_timestamp:
TiDB 默认:ON,且仅支持设置该值为 ON。
MySQL 5.7 默认:OFF。
MySQL 8.0 默认:ON。

–问题重现
CREATE TABLE test (
id int NOT NULL,
modify_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT ‘创建时间’
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin

insert into test(id,modify_time) values (1,null);
Error Code: 1048. Column ‘modify_time’ cannot be null

现在有生产环境mysql5.7.20要迁移到tidb,但是原代码好多对于timestamp为null的部分,在不修改代码的情况下,怎么能避免此类错误?

1、可不可以为 null,表结构需要去掉 not null 属性
2、如果担心 为 null 的行,再被 update 时,变成不为 null,建议查看一下 mysql 行为,上面的参数为 on 时才对吧(不过记得好像是这个参数没效果)

不能修改表结构和源码,在表结构不变 modify_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP的情况下,怎么能避免以下错误
insert into test(id,modify_time) values (1,null);
Error Code: 1048. Column ‘modify_time’ cannot be null
有什么替代方案,或者tidb参数能解决这个问题吗?

代码中,除了 null 值的直接插入,还有其他情况吗,譬如使用 default 还是 now() 来插入该列。
PS:如果是后者可以尝试将 tidb 中表结构去掉 not null 属性
因为 tidb 中的表结构是否可以被修改需要结合业务来定,目前没有好的办法可以解决

https://docs.pingcap.com/zh/tidb/stable/tidb-troubleshooting-map#61-tidb-binlog-问题![image|690x181](upload://ow92LkJ56q7SfwbZfiFbDIKhHOR.png)