explicit_defaults_for_timestamp

4285 ワード

転載先:https://www.cnblogs.com/JiangLe/p/6956865.htmlmysql explicit_defaults_for_timestamp変数の役割mysqlには、1行のデータの一部の列が更新され、この行に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に設定すると新しい接続がonQuery OKに設定され、0 rows affected(0.00 sec)
mysql> set @@session.explicit_defaults_for_timestamp=on; -- 現在の接続をexplicit_defaults_for_timestampはonQuery OK、0 rows affected(0.00 sec)に設定
mysql> update t set x=3 ; -- 1回目の更新結果は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 ; -- 2回目の更新結果はやはり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)