explicit_defaults_for_timstamp
が MySQL 8.0 からデフォルトで ON
になりました。アプリケーションに影響が出る可能性があるため、要点を確認しました。
DML の挙動の変化は yoku0825 さんがまとめてます。
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 以降では 動的に設定変更が可能です。