mita2 database life

主にMySQLに関するメモです

MySQL explicit_defaults_for_timstamp ON と OFF の CREATE TABLE 時の挙動

explicit_defaults_for_timstampMySQL 8.0 からデフォルトで ON になりました。アプリケーションに影響が出る可能性があるため、要点を確認しました。 DML の挙動の変化は yoku0825 さんがまとめてます。

yoku0825.blogspot.com

CREATE TABLE の挙動の変化

DDL への影響を忘れずに、メモしておきたいと思います。 以下のようにTIMESTAMP型のデフォルト値を指定しなかった場合に、カラムの定義が異なります。

mysql> CREATE TABLE t_on (ts TIMESTAMP);

explicit_defaults_for_timstamp = OFF (〜5.7 までの挙動)

NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP が自動で設定されます。 よって、レコード更新時に自動で現在時刻が保存されます。

CREATE TABLE `t_off` (
  `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP) ENGINE=InnoDB

explicit_defaults_for_timstamp = ON (8.0〜の挙動)

NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP が設定されません。 この状態では、レコード更新時に自動で時刻が保存されません。更新クエリで、明示的に値を NOW() を指定して現在時刻に UPDATEするか、CREATE TABLE 時に NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP を明示的に指定する必要があります。

CREATE TABLE `t_on` (
  `ts` timestamp NULL DEFAULT NULL
) ENGINE=InnoDB DEFAULT 

5.7 から DYNAMIC に変更できる

explicit_defaults_for_timstamp は 5.6 では 動的に変更できませんでした。 5.7 以降では 動的に設定変更が可能です。