ローカルで問題なかったDBマイグレーションがテストサーバーで失敗した。エラーが起きたのはdatetime型カラムのデフォルトにnow()を指定している箇所。
DBエンジンはMariaDB 5.5.60 (ちなみにローカルはMySQL 5.7.27)。
1 2 |
$ mysql --version mysql Ver 15.1 Distrib 5.5.60-MariaDB, for Linux (x86_64) using readline 5.1 |
簡単なSQLで試してみる。
1 2 |
MariaDB [reserve]> create table test (created_at datetime default now()); ERROR 1067 (42000): Invalid default value for 'created_at' |
datetime型にnow()をデフォルトにできない。
1 2 |
MariaDB [reserve]> create table test (created_at timestamp default now()); Query OK, 0 rows affected (0.00 sec) |
timestamp型だとnow()をデフォルトにできる
MariaDBの仕様かなと思って調べると以下の記事がヒット。
mysql – MariaDB CURRENT_TIMESTAMP default – Stack Overflow
https://stackoverflow.com/questions/40864951/mariadb-current-timestamp-default
CURRENT_TIMESTAMP as a default for DATETIME type is only available in 10.x.
If you’re using 5.5, it should a TIMESTAMP column.
MariaDBを10.xにアップグレードすれば解決するみたいだ。
参考サイト
MySQLのDATETIME型とTIMESTAMP型の違いを検証してみた – Qiita
https://qiita.com/ykawakami/items/2449a24e3b82ff0cbab6
MySQL :: MySQL 5.6 リファレンスマニュアル :: 11.3.1 DATE、DATETIME、および TIMESTAMP 型
https://dev.mysql.com/doc/refman/5.6/ja/datetime.html
MySQL :: MySQL 5.6 リファレンスマニュアル :: 11.3.5 TIMESTAMP および DATETIME の自動初期化および更新機能
https://dev.mysql.com/doc/refman/5.6/ja/timestamp-initialization.html
mysql – Invalid default value for ‘dateAdded’ – Stack Overflow
https://stackoverflow.com/questions/9005766/invalid-default-value-for-dateadded