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时,插入会报错,可以设置关掉

相关推荐
threerocks12 分钟前
AI 原生软件开发生命周期手册 - 如何借助 AI,逐阶段改造软件开发生命周期
前端·javascript·后端
lzhdim14 分钟前
提高 SQL 语句执行速度的方法
java·开发语言·数据库·sql·oracle
JavaPub-rodert18 分钟前
王仕宇在 Go Context 如何解决协程泄漏与超时控制
开发语言·后端·golang·iphone·javapub·王仕宇
ltl40 分钟前
ClickHouse Distributed 引擎与分布式查询路由
数据库
Wang's Blog41 分钟前
PostgreSQL笔记60: 权限与角色管理——从层级体系到最佳实践
数据库·笔记·postgresql
深漂的华哥1 小时前
Ruoyi-Plus前后端分离场景下,数据加密传输
java·spring boot·后端·开源·maven·ruoyi
whcyhhh2 小时前
头歌实践教学平台:大数据存储2023(六)
大数据·数据库·python
why技术2 小时前
eli5,我觉得这个全网在吹的技能,使用体验真的很一般啊。
前端·人工智能·后端
学习星球2 小时前
Qwik 框架入门实战:从开源项目 Qwik City 开始,用可恢复性替代水合
后端·前端框架·开源·c5全栈
Elastic 中国社区官方博客3 小时前
让大模型思考,让小模型执行:在 Elastic Workflows 中拆分 LLM 成本
大数据·运维·数据库·人工智能·elasticsearch·ai