MySQL迁移中explicit_defaults_for_timestamp参数影响

 更新时间:2024年09月09日 10:51:35   作者:Bing@DBA  
在MySQL数据库迁移过程中,explicit_defaults_for_timestamp参数设置为off可能导致数据写入行为变化,本文就来介绍一下explicit_defaults_for_timestamp参数影响,感兴趣的可以了解一下

前言

最近在做数据迁移的时候,使用的是云平台自带的同步工具,在预检查阶段,当时报错 explicit_defaults_for_timestamp 参数在目标端为 off 建议修改 on,有什么风险呢?在此记录下。

测试对比

MySQL 默认情况下 explicit_defaults_for_timestamp = 0 我们对比一下看看。

explicit_defaults_for_timestamp = 0

在 explicit_defaults_for_timestamp 参数等于 0 的状态下,如果第一个 timestamp 类型的字段如果没有设置 null 将会自动加上 not null 和默认值。如果设置了默认值,则会自动加上 not null,其他类型的字段是不会的。

create table test03 (
    a_time timestamp ,
    b_time timestamp null ,
    c_time timestamp default '2024-01-01 00:00:00',
    name varchar(2) default 'a');

show create table test03;

CREATE TABLE `test03` (
  `a_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `b_time` timestamp NULL DEFAULT NULL,
  `c_time` timestamp NOT NULL DEFAULT '2024-01-01 00:00:00',
  `name` varchar(2) DEFAULT 'a'
) ENGINE=InnoDB DEFAULT CHARSET=latin1

然后,我们尝试插入一个记录:

insert into test03 values (null, null, null, null);
a_timeb_timec_timename
2024-09-05 14:37:12NULL2024-09-05 14:37:12NULL

可以看到,在 explicit_defaults_for_timestamp 等于 0 的时候,不仅会影响表结构,还会影响写入。虽然 timestamp 是 not null 我们写入 null 后变为了 CURRENT_TIMESTAMP。

如果此时将参数设置为 1,执行相同的 SQL 语句则会报错:

# 设置参数为 1
set global explicit_defaults_for_timestamp = 1;

# 插入相同的数据
insert into test03 values (null, null, null, null);

[23000][1048] Column ‘a_time’ cannot be null

explicit_defaults_for_timestamp = 1

此时在 explicit_defaults_for_timestamp 等于 1 的条件下,执行一个刚才的建表语句:

create table test04 (
    a_time timestamp ,
    b_time timestamp null ,
    c_time timestamp default '2024-01-01 00:00:00',
    d_time timestamp not null );

show create table test04;

CREATE TABLE `test04` (
  `a_time` timestamp NULL DEFAULT NULL,
  `b_time` timestamp NULL DEFAULT NULL,
  `c_time` timestamp NULL DEFAULT '2024-01-01 00:00:00',
  `d_time` timestamp NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1

尝试插入数据:

insert into test04 values (null, null, null, null);
a_timeb_timec_timename
NULLNULLNULLNULL

从上面可以看到,参数开启的情况下,MySQL 默认会为 timestamp 为 NULL 的字段添加 default null 属性。而且 MySQL 没有为第一个 timestamp 设置默认值,当我写入 null 后,则按照 null 来存储。

另外,如果 timestamp 设置为 not null 那么写入 null 时会报错,如果 sql_mode 中不包含 SQL_MODE 的话,则存储为 ‘0000-00-00 00:00:00’ 并抛出一个异常。

总结

生产环境 timestamp 字段一般都会设置为如下样式,而且需要 timestamp 字段为 null 的业务场景很少。

`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
`updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',

如果生产环境,要修改这个参数,从 0 调整到 1 需要关注的就是 insert 语句,有没有直接图省事插入 null 表示当前时间,如果有这种不规范的语法,那么调整该参数后,可能会报错。

云平台一般不会给用户 super 账号,所以在迁移过程中,可能无法设置 session 级别的参数,此时建议跳过该校验,不修改全局级别的参数。

到此这篇关于MySQL 迁移中 explicit_defaults_for_timestamp参数影响的文章就介绍到这了,更多相关MySQL explicit_defaults_for_timestamp参数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 深入理解MySQL事务特性与自动提交

    深入理解MySQL事务特性与自动提交

    事务以及事务隔离机制,其实是所有关系型数据库都有的问题,本文主要介绍了深入理解MySQL事务特性与自动提交,具有一定的参考价值,感兴趣的可以了解一下
    2024-07-07
  • Mysql内置函数的实现示例

    Mysql内置函数的实现示例

    mysql内置了很多的函数,本文主要介绍了Mysql内置函数的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-07-07
  • mysql的约束及实例分析

    mysql的约束及实例分析

    这篇文章主要介绍了mysql的约束及实例分析,真正约束字段的是数据类型,但是数据类型约束很单一,需要有一些额外的约束,更好的保证数据的合法性,从业务逻辑角度保证数据的正确性,需要的朋友可以参考下
    2023-07-07
  • MySQL数据库自动化备份脚本的实践指南

    MySQL数据库自动化备份脚本的实践指南

    数据是企业的核心资产,定期备份数据库是每个运维和开发人员的必修课,本文分享一个生产环境验证过的 MySQL 自动备份脚本,支持多数据库备份、自动压缩、过期清理,并详细解读每一处细节,帮助你快速搭建可靠的备份体系,需要的朋友可以参考下
    2026-04-04
  • Mysql查询时如何使用for update行锁还是表锁

    Mysql查询时如何使用for update行锁还是表锁

    这篇文章主要介绍了Mysql查询时如何使用for update行锁还是表锁问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • MySQL如何将一个表的字段更新到另一个表中

    MySQL如何将一个表的字段更新到另一个表中

    在数据库管理中,经常需要将一个表中的数据更新到另一个表中,本文将通过几个简单示例为大家详细介绍如何在MySQL中实现这一功能,有需要的可以参考下
    2025-01-01
  • MySql主从复制机制全面解析

    MySql主从复制机制全面解析

    这篇文章主要介绍了MySql主从复制机制全面解析的相关资料,帮助大家更好的理解和学习使用MySQL数据库,感兴趣的朋友可以了解下
    2021-04-04
  • MySQL中修改表结构时需要注意的一些地方

    MySQL中修改表结构时需要注意的一些地方

    这篇文章主要介绍了MySQL中修改表结构时需要注意的一些地方,作者援引Percona的相关的说明来讲述如何避免相关操作导致表无法使用的问题,一些需要的朋友可以参考下
    2015-06-06
  • MySQL索引失效的几种情况详析

    MySQL索引失效的几种情况详析

    这篇文章主要给大家介绍了关于MySQL索引失效的几种情况,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • 深度解析如何正确使用MySQL日期时间类型

    深度解析如何正确使用MySQL日期时间类型

    MySQL作为主流关系型数据库,其日期时间类型的选择策略对系统性能与功能实现至关重要,本文将从技术原理与工程实践角度展开深度分析,感兴趣的小伙伴可以了解下
    2025-06-06

最新评论