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

相关推荐
间彧5 分钟前
单例模式防御反射与序列化攻击的意义与实践
后端
程序新视界7 分钟前
MySQL中,IS NULL和IS NOT NULL不会走索引?错!
数据库·mysql·dba
EnCi Zheng8 分钟前
@ResponseStatus 注解详解
java·spring boot·后端
间彧9 分钟前
Java枚举单例详解与项目实战指南
后端
wdfk_prog21 分钟前
闹钟定时器(Alarm Timer)初始化:构建可挂起的定时器基础框架
java·linux·数据库
许长安29 分钟前
Redis(二)——Redis协议与异步方式
数据库·redis·junit
Arva .31 分钟前
开发准备之日志 git
spring boot·git·后端
小宁爱Python1 小时前
从零搭建 RAG 智能问答系统1:基于 LlamaIndex 与 Chainlit实现最简单的聊天助手
人工智能·后端·python
java_python源码1 小时前
python高校心理健康服务小程序(源码+文档+调试+基础修改+答疑)
数据库·sqlite