explicit_defaults_for_timestamp使用

前言

explicit_defaults_for_timestamp系统变量决定MySQL服务端对timestamp列中的默认值和NULL值的不同处理方法

explicit_defaults_for_timestamp使用

变量解释

MySQL5.7以下版本中,这个系统变量默认是关闭的,可以利用以下语句查询该系统变量处理打开还是关闭

sql 复制代码
show global VARIABLES like 'explicit_defaults_for_timestamp%';

这里使用的是MySQL5.7版本

Off状态

1、 新建一张新表

sql 复制代码
-- ----------------------------
-- Table structure for device
-- ----------------------------
DROP TABLE IF EXISTS `sys_device`;
CREATE TABLE `sys_device`  (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `deviceName` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '自定义设备名称',
  `createTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updateTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 96713335083012 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '设备' ROW_FORMAT = DYNAMIC;

2、 执行以下语句

sql 复制代码
insert into sys_device (id, deviceName, createTime) VALUES (1, 'aaaa' ,NULL);

结果如下图

时间会以当前时间为准

3、 执行以下语句

sql 复制代码
insert into sys_device (id, deviceName) VALUES (2, 'aaaa2');

结果如下图 时间戳还是以当前为准

ON状态

1、执行以下语句,打开状态

ini 复制代码
SET @@GLOBAL.explicit_defaults_for_timestamp = 'ON';

2、查询explicit_defaults_for_timestamp当前状态

3、将上述数据清除,然后执行以下语句

sql 复制代码
insert into sys_device (id, deviceName) VALUES (1, 'aaaa2');

结果如下图 如果strict sql_mode没被指定了,那么可以继续插入,如果指定了,就直接报错

4、以MySQL8数据库版本为准,该版本以上的数据库默认是开启的

5、执行以下语句会报错

sql 复制代码
insert into sys_device (id, deviceName, createTime, updateTime) VALUES (3, 'aaaa3', null, null);

总结

当explicit_defaults_for_timestamp=OFF时,即使timestamp列设为NOT NULL也能插入NULL值,系统会自动将NULL值设为current timestamp,当开启了Strict Mode时,插入会报错,可以设置关掉

相关推荐
程序员小假12 小时前
我们来说一下无锁队列 Disruptor 的原理
java·后端
IDC02_FEIYA13 小时前
SQL Server 2025数据库安装图文教程(附SQL Server2025数据库下载安装包)
数据库·windows
辞砚技术录13 小时前
MySQL面试题——联合索引
数据库·面试
萧曵 丶13 小时前
MySQL 主键不推荐使用 UUID 的深层原因
数据库·mysql·索引
武子康13 小时前
大数据-209 深度理解逻辑回归(Logistic Regression)与梯度下降优化算法
大数据·后端·机器学习
小北方城市网13 小时前
分布式锁实战指南:从选型到落地,避开 90% 的坑
java·数据库·redis·分布式·python·缓存
maozexijr13 小时前
Rabbit MQ中@Exchange(durable = “true“) 和 @Queue(durable = “true“) 有什么区别
开发语言·后端·ruby
源码获取_wx:Fegn089514 小时前
基于 vue智慧养老院系统
开发语言·前端·javascript·vue.js·spring boot·后端·课程设计
毕设十刻14 小时前
基于Vue的人事管理系统67zzz(程序 + 源码 + 数据库 + 调试部署 + 开发环境配置),配套论文文档字数达万字以上,文末可获取,系统界面展示置于文末
前端·数据库·vue.js
独断万古他化14 小时前
【Spring 核心: IoC&DI】从原理到注解使用、注入方式全攻略
java·后端·spring·java-ee