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

相关推荐
元清加油13 分钟前
【Goland】:协程和通道
服务器·开发语言·后端·网络协议·golang
CodeSheep18 分钟前
我天,Java 已沦为老四。。
前端·后端·程序员
这里有鱼汤21 分钟前
原来基金经理都偷偷用这个指标选股,难怪回撤小还赚钱
后端·python
掘金安东尼29 分钟前
使用 Web Components 与 CSS Modules 构建原生应用架构
javascript·后端·面试
ademen39 分钟前
spring第9课,spring对DAO的支持
java·数据库·spring
CF14年老兵41 分钟前
🐍 Python黑魔法手册:让你的代码从能跑到飞起的奇技淫巧
后端·python·trae
Java小白程序员44 分钟前
SQL 语句进阶实战:从基础查询到性能优化全指南
数据库·sql·性能优化
小鱼人爱编程1 小时前
Java基石--动态代理让你无中生有
java·后端·架构
lpfasd1231 小时前
01_Go语言基础与环境搭建
开发语言·后端·golang
xiezhr1 小时前
别再被VO、BO、PO、DTO、DO绕晕!今天用一段代码把它们讲透
java·后端·spring