mysql explicit_defaults_for_timestamp 变量的作用
mysql 中有这样的一个默认行为,如果一行数据中某些列被更新了,如果这一行中有timestamp类型的列,那么么这个timestamp列的数据
也会被自动更新到 更新操作所发生的那个时间点;这个操作是由explicit_defaults_for_timestamp这个变更控制的
一、体验一下mysql的默认更新行为:
mysql> create table t(x int ,y timestamp); -- 创建一个带有timestamp列的表
Query OK, 0 rows affected (0.01 sec) mysql> insert into t(x) values(1); -- 只插x列
Query OK, 1 row affected (0.00 sec) mysql> select * from t; -- timestamp列会自动更新
+------+---------------------+
| x | y |
+------+---------------------+
| 1 | 2017-06-07 13:48:56 |
+------+---------------------+
1 row in set (0.00 sec) mysql> update t set x=2 where x=1; -- update 时timestamp列还是会自动更新
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0 mysql> select * from t;
+------+---------------------+
| x | y |
+------+---------------------+
| 2 | 2017-06-07 13:49:21 |
+------+---------------------+
1 row in set (0.00 sec)
二、如何关闭这一默认行为:
聪明的你一想到了,只要把explicit_defaults_for_timestamp这个变更设置为on;对于timestamp列的值都要显示指定,那么这一默认行为就
算是关闭了。来操作一把!
mysql> set @@global.explicit_defaults_for_timestamp=on; -- 把全局的设置为on 那么新的连接就会被设置成on
Query OK, 0 rows affected (0.00 sec) mysql> set @@session.explicit_defaults_for_timestamp=on; -- 把当前连接explicit_defaults_for_timestamp设置为on
Query OK, 0 rows affected (0.00 sec) mysql> update t set x=3 ; -- 第一次更新 结果是变了
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0 mysql> select * from t;
+------+---------------------+
| x | y |
+------+---------------------+
| 3 | 2017-06-07 13:57:21 |
+------+---------------------+
1 row in set (0.00 sec) mysql> update t set x=4 ; -- 第二次更新 结果还是变了
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0 mysql> select * from t;
+------+---------------------+
| x | y |
+------+---------------------+
| 4 | 2017-06-07 13:57:52 |
+------+---------------------+
1 row in set (0.00 sec) mysql> show variables like 'explicit_defaults_for_timestamp'; -- 全局发动生效
+---------------------------------+-------+
| Variable_name | Value |
+---------------------------------+-------+
| explicit_defaults_for_timestamp | ON |
+---------------------------------+-------+
1 row in set (0.00 sec) mysql> show global variables like 'explicit_defaults_for_timestamp'; -- session 级别改动也升效了
+---------------------------------+-------+
| Variable_name | Value |
+---------------------------------+-------+
| explicit_defaults_for_timestamp | ON |
+---------------------------------+-------+
1 row in set (0.00 sec) -- 发现了吧、就算把explicit_defaults_for_timestamp 设置成了on 也不会有效的
三、找问题出在了哪里:
1、explicit_defaults_for_timestamp=off 时表结构
CREATE TABLE `t` (
`x` int(11) DEFAULT NULL,
`y` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- `y` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE
2、explicit_defaults_for_timestamp=on 时表结构
CREATE TABLE `t6` (
`x` int(11) DEFAULT NULL,
`y` timestamp NULL DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- `y` timestamp NULL DEFAULT NULL
四、结论:
explicit_defaults_for_timestamp 变量会直接影响表结构,也就是说explicit_defaults_for_timestamp的作用时间
是在表定义的时候;你的update | insert 想通过它去改变行为已经太晚了!
五、如何解决这失控的场面:
1、改表结构
mysql> alter table t modify column y timestamp null default null; -- 解决办法改表结构
Query OK, 0 rows affected (0.05 sec)
Records: 0 Duplicates: 0 Warnings: 0 mysql> update t set x=1;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0 mysql> select * from t;
+------+---------------------+
| x | y |
+------+---------------------+
| 1 | 2017-06-07 13:59:21 |
+------+---------------------+
1 row in set (0.00 sec) mysql> update t set x=2; -- 再次对比,发现时间没有变哦!
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0 mysql> select * from t;
+------+---------------------+
| x | y |
+------+---------------------+
| 2 | 2017-06-07 13:59:21 |
+------+---------------------+
1 row in set (0.00 sec)
----
学习交流
mysql explicit_defaults_for_timestamp 变量的作用的更多相关文章
- MySQL基础之 path环境变量的作用 (科普)
在谈mysql配置环境变量之前,先谈一下windows环境变量的作用,有时候在windows cmd窗口运行命令时,经常会出现“XXX不是内部或外部命令的提示” 原因是系统没有找到执行相应命令的文件( ...
- MySQL 服务器变量 数据操作DML-视图
原文:MySQL 服务器变量 数据操作DML-视图 SQL语言的组成部分 常见分类: DDL:数据定义语言 DCL:数据控制语言,如授权 DML:数据操作语言 其它分类: 完整性定义语言: DDL的一 ...
- MySQL系统变量配置基础
本文出处:http://www.cnblogs.com/wy123/p/6595556.html MySQL变量的概念 个人认为可以理解成MySQL在启动或者运行过程中读取的一些参数问题,利用这些参数 ...
- MySQL中变量的定义和变量的赋值使用(转)
说明:现在市面上定义变量的教程和书籍基本都放在存储过程上说明,但是存储过程上变量只能作用于begin...end块中,而普通的变量定义和使用都说的比较少,针对此类问题只能在官方文档中才能找到讲解. 前 ...
- mysql中变量的定义
mysql中的变量定义 mysql的变量分为系统变量和用户变量,mysql系统定义的变量是系统变量,用户自己定义的变量为用户变量.对于系统变量,用户只能够改变它的值不能够创建新的系统变量.对于用户变量 ...
- MySQL服务器变量:MySQL系列之八
注意:其中有些参数支持运行时修改,会立即生效:有些参数不支持,且只能通过修改配置文件,并重启服务器程序生效:有些参数作用域是全局的,且不可改变:有些可以为每个用户提供单独(会话)的设置 一.服务器选项 ...
- 转:MySQL中变量的定义和变量的赋值使用(转)
MySQL中变量的定义和变量的赋值使用(转) 说明:现在市面上定义变量的教程和书籍基本都放在存储过程上说明,但是存储过程上变量只能作用于begin...end块中,而普通的变量定义和使用都说的比较 ...
- mysql服务器变量、缓存及索引
服务器变量 注意:其中有些参数支持运行时修改,会立即生效:有些参数不支持,且只能通过修改配置文件,并重启服务器程序生效:有些参数作用域是全局的,且不可改变:有些可以为每个用户提供单独(会话)的设置. ...
- Mysql 声明变量
Mysql 声明变量 Mysql中声明变量有两种方式 第一种: set @num=1; 或set @num:=1; //这里要使用变量来保存数据,直接使用@num变量 第二种: select @num ...
随机推荐
- JPA的锁机制
JPA 各种实体锁模式的区别 字数2084 阅读304 评论0 喜欢4 为了能够同步访问实体,JPA提供了2种锁机制.这两种机制都可以避免两个事务中的其中一个,在不知情的情况下覆盖另一个事务的数据. ...
- Saltstack之api
Salt-API 1,htps证书 2,配置文件 3,验证.使用PAM验证 4,启动salt-api 安装salt-api yum -y install salt-api 创建用户 useradd - ...
- NLP-python 自然语言处理01
# -*- coding: utf-8 -*- """ Created on Wed Sep 6 22:21:09 2017 @author: Administrator ...
- logback多环境配置
现在项目基本都是要区分测试开发等等一系列环境的,也因此maven,spring之类的都具有profile这类功能,可以针对不同的环境采用不同的配置.因此日志也可能根据不同的环境需要不同的配置.恰巧手头 ...
- pro 图层 叹号
同事遇到问题,后来他自己探索解决了~~大致记录如下 pro1.4中打开mxd,部分图层前显示叹号.根据arcmap的经验,点击叹号去修复,结果显示 不支持类型数据. 后解决办法:新建pro 的proj ...
- HashMap实现原理分析(面试问题:两个hashcode相同 的对象怎么存入hashmap的)
1. HashMap的数据结构 数据结构中有数组和链表来实现对数据的存储,但这两者基本上是两个极端. 数组 数组存储区间是连续的,占用内存严重,故空间复杂的很大.但数组的二分查找时间复杂度小,为O(1 ...
- linux系统java的安装
(一)下载java8 下载链接:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html ...
- java动态加载
先贴个笔记,后续用得着再深究. package test; import java.io.File; import java.io.IOException; import java.lang.refl ...
- curl 一个无比有用的网站开发工具
1.Common Line Url Viewer curl是一种命令行工具,作用是发出网络请求,然后得到和提取数据,显示在"标准输出"(stdout)上面. 2.-i参数可以显示h ...
- android 操作SD卡上的文件
(1)说明:操作SD卡上的文件须要增加下面权限 在SD卡上创建和删除文件权限 <uses-permission android:name="android.permission.M ...