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 变量的作用的更多相关文章

  1. MySQL基础之 path环境变量的作用 (科普)

    在谈mysql配置环境变量之前,先谈一下windows环境变量的作用,有时候在windows cmd窗口运行命令时,经常会出现“XXX不是内部或外部命令的提示” 原因是系统没有找到执行相应命令的文件( ...

  2. MySQL 服务器变量 数据操作DML-视图

    原文:MySQL 服务器变量 数据操作DML-视图 SQL语言的组成部分 常见分类: DDL:数据定义语言 DCL:数据控制语言,如授权 DML:数据操作语言 其它分类: 完整性定义语言: DDL的一 ...

  3. MySQL系统变量配置基础

    本文出处:http://www.cnblogs.com/wy123/p/6595556.html MySQL变量的概念 个人认为可以理解成MySQL在启动或者运行过程中读取的一些参数问题,利用这些参数 ...

  4. MySQL中变量的定义和变量的赋值使用(转)

    说明:现在市面上定义变量的教程和书籍基本都放在存储过程上说明,但是存储过程上变量只能作用于begin...end块中,而普通的变量定义和使用都说的比较少,针对此类问题只能在官方文档中才能找到讲解. 前 ...

  5. mysql中变量的定义

    mysql中的变量定义 mysql的变量分为系统变量和用户变量,mysql系统定义的变量是系统变量,用户自己定义的变量为用户变量.对于系统变量,用户只能够改变它的值不能够创建新的系统变量.对于用户变量 ...

  6. MySQL服务器变量:MySQL系列之八

    注意:其中有些参数支持运行时修改,会立即生效:有些参数不支持,且只能通过修改配置文件,并重启服务器程序生效:有些参数作用域是全局的,且不可改变:有些可以为每个用户提供单独(会话)的设置 一.服务器选项 ...

  7. 转:MySQL中变量的定义和变量的赋值使用(转)

    MySQL中变量的定义和变量的赋值使用(转)   说明:现在市面上定义变量的教程和书籍基本都放在存储过程上说明,但是存储过程上变量只能作用于begin...end块中,而普通的变量定义和使用都说的比较 ...

  8. mysql服务器变量、缓存及索引

    服务器变量 注意:其中有些参数支持运行时修改,会立即生效:有些参数不支持,且只能通过修改配置文件,并重启服务器程序生效:有些参数作用域是全局的,且不可改变:有些可以为每个用户提供单独(会话)的设置. ...

  9. Mysql 声明变量

    Mysql 声明变量 Mysql中声明变量有两种方式 第一种: set @num=1; 或set @num:=1; //这里要使用变量来保存数据,直接使用@num变量 第二种: select @num ...

随机推荐

  1. SQL Fundamentals || DCL(Data Control Language) || 用户管理&Profile概要文件

    SQL Fundamentals || Oracle SQL语言 语句 解释 Create user Creates a user(usually performed by a DBA) Grant ...

  2. 在python中读写matlab文件

    scipy.io提供有两个函数loadmat和savemat,用来读取和存储mat的数据文件 import scipy.io as sio 还有一些其他常用的模块 import numpy as np ...

  3. c# 实现ListView的排序

    [问题描述]: 当点击列标题的时候,能够完成对该列排序,同时显示排序的箭头,再次点击,按照反序排序. [解决方法]: 1.创建一个类:ListViewColumnSorter继承IComparer接口 ...

  4. 洛谷P3557 GRA-Tower Defense Game [POI2013] 构造

    正解:构造 解题报告: 传送门 话说这题我理解题意理解了好久TT一直没懂那个,k的意义是什么,,,后来才明白,可能k就是没有意义的趴 (upd:好像明白辣,k是用来保证这么做是对的QwQ 然后就直接港 ...

  5. 几种常见web攻击手段及其防御方式

    XSS(跨站脚本攻击) CSRF(跨站请求伪造) SQL注入 DDOS web安全系列目录 总结几种常见web攻击手段极其防御方式 总结几种常见的安全算法 XSS 概念 全称是跨站脚本攻击(Cross ...

  6. SQL SERVER 聚集索引 非聚集索引 区别

    转自http://blog.csdn.net/single_wolf_wolf/article/details/52915862 一.理解索引的结构 索引在数据库中的作用类似于目录在书籍中的作用,用来 ...

  7. 005-redis-命令-无序集合,有序集合

    Redis 无序集合命令 下表列出了 Redis 集合基本命令: 序号 命令及描述 1 SADD key member1 [member2] 向集合添加一个或多个成员 2 SCARD key 获取集合 ...

  8. [py][mx]django项目-让系统用自定义的users表认证

    项目开端 参考的是mxonline项目 先把这两项完成 1.app设计 2.app的models的设计 经过分析系统有四个模块 users - 用户管理 course - 课程管理 oranizati ...

  9. R-sampe & seq函数学习[转载]

    转自:https://blog.csdn.net/u012108367/article/details/69913280 https://blog.csdn.net/qq_33547243/artic ...

  10. PAT 1097 Deduplication on a Linked List[比较]

    1097 Deduplication on a Linked List(25 分) Given a singly linked list L with integer keys, you are su ...