MySQL5.6で増えたexplicit_defaults_for_timestamp

あまりぐぐっても出てこなかったので簡単に書いてみる。

MySQL5.5のmy.cnfをそのまま流用してMySQL5.6を起動すると以下のようなメッセージがエラーログファイルに出力される。長いので改行していますが実際は一行。

121104 22:29:57 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. 
Please use --explicit_defaults_for_timestamp server option (see documentation for more details).

こちらはMySQL 5.6.6から追加されたexplicit_defaults_for_timestampによるもの。

booleanでデフォルトはFALSE(0)。動的変更は不可となります。公式Doc

とりあえずFALSEの状態でtimestamp型のカラムを含むテーブルを作成してみます。

mysql> show global variables like 'explicit_defaults_for_timestamp';
+---------------------------------+-------+
| Variable_name                   | Value |
+---------------------------------+-------+
| explicit_defaults_for_timestamp | OFF   |
+---------------------------------+-------+
1 row in set (0.00 sec)

mysql> use test
Database changed
mysql> create table test ( update_time timestamp ) ENGINE=InnoDB;
Query OK, 0 rows affected (0.09 sec)

mysql> show create table test\G
*************************** 1. row ***************************
       Table: test
Create Table: CREATE TABLE `test` (
  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

mysql> 

明示的に属性は指定しませんでしたが以下属性が付与されています。これは以前のバージョンと同じ挙動。

`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

ではmy.cnfを変更し、TRUEとして再起動後、再度作成してみます。

mysql> show global variables like 'explicit_defaults_for_timestamp';
+---------------------------------+-------+
| Variable_name                   | Value |
+---------------------------------+-------+
| explicit_defaults_for_timestamp | ON    |
+---------------------------------+-------+
1 row in set (0.00 sec)

mysql> use test
Database changed
mysql> show create table test\G
*************************** 1. row ***************************
       Table: test
Create Table: CREATE TABLE `test` (
  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

mysql> drop table test;
Query OK, 0 rows affected (0.03 sec)

mysql> create table test ( update_time timestamp ) ENGINE=InnoDB; 
Query OK, 0 rows affected (0.04 sec)

mysql> show create table test\G
*************************** 1. row ***************************
       Table: test
Create Table: CREATE TABLE `test` (
  `update_time` timestamp NULL DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

mysql> 

今度は属性が付与されません。

エラーログの出力にあるよう、timestamp型の暗黙的なデフォルト値(属性)はそのうち廃止されるようなので今のうちから必要な属性は自分で付与するように気をつけた方が良さそうです。
細々と解説が書いてあるので5.6へバージョンアップする際は念のため挙動が同じか確認した方が良いでしょう。エラーログにWarningが出ても気にしないのであれば当面はFALSEで運用するのもありかと。たぶん以前のバージョンと同じ挙動っぽいですし。
とはいえ早めに廃止されても問題無いようにしておくことが無難かと。

ただ周りに聞くと、なんで今更挙動変えるのー、といった声が聞こえて来たり。長い事使っている人だとデフォルトで付与されるのを前提に考えてたりするのでそうなるんだと思いますが、知らないでいると廃止されたタイミングでちょっと焦るかもしれない…