【MySQL】datetime型でInvalid default valueというエラーが出たときの対処法

mysql エンジニア
記事内に広告が含まれています。

ユーザーテーブルを作成する際に、

CREATE TABLE `users` (
  `id` int(10) NOT NULL AUTO_INCREMENT, PRIMARY KEY(id) COMMENT 'ID',
  `email` varchar(256) NOT NULL COMMENT 'メールアドレス',
  `created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '登録日',
  `updated` datetime NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '更新日'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='ユーザー';

下記のようなエラーが出て、テーブルを作成できないという問題が発生しました。

ERROR 1067 (42000): Invalid default value for 'created'

 

しゅんご
しゅんご

この記事ではdatetime型で“Invalid default value”というエラーが出たときの対処法をご紹介します。

 

Invalid default valueというエラーが出たときの対処法

サポートしている範囲の日付を値に入れる

MySQLの公式ドキュメントに下記の記載があります。

 

DATETIME 型は、日付と時間の両方の部分を含む値に使用されます。 MySQL は、DATETIME 値を'YYYY-MM-DD hh:mm:ss'形式で取得して表示します。 サポートしている範囲は '1000-01-01 00:00:00' から '9999-12-31 23:59:59' です。

引用: 11.2.2 DATE、DATETIME、および TIMESTAMP 型

 

サポート範囲に入っていない、“0000-00-00 00:00:00”という値を入れていたのでエラーになっていました。

そのため、サポート範囲に入っている、“1000-01-01 00:00:00”に変更しました。

CREATE TABLE `users` (
  `id` int(10) NOT NULL AUTO_INCREMENT, PRIMARY KEY(id) COMMENT 'ID',
  `email` varchar(256) NOT NULL COMMENT 'メールアドレス',
  `created` datetime NOT NULL DEFAULT '1000-01-01 00:00:00' COMMENT '登録日',
  `updated` datetime NOT NULL DEFAULT '1000-01-01 00:00:00' COMMENT '更新日'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='ユーザー';

するとエラーなく、テーブルを作成することができました!

 

SQLモードを変更する

こちらの方法ではエラーはなくせますが、警告が出るのでおすすめはできません。

一時的な対応でやむを得ない場合のみ参考にしてください。

 

SQLモードとは

無効な値が入ってきたときにどのように処理するかを決めるのがSQLモードです。

公式ドキュメントの厳密なSQLモードに下記の記載があります。

厳密モードは、MySQL が INSERT や UPDATE などのデータ変更ステートメントで無効な値または欠落した値を処理する方法を制御します。値はいくつかの理由で無効になることがあります。たとえば、カラムに対して正しくないデータ型を持っていたり、範囲外であったりすることがあります。値の欠落が発生するのは、挿入される新しい行の非 NULL カラムに値が含まれておらず、そのカラムに明示的な DEFAULT 句が定義されていない場合です。(NULL カラムの場合、値が欠落しているときは NULL が挿入されます。)

そのため、SQLモードを変更してdatetime型に“0000-00-00 00:00:00”を許容することでエラーは回避できます。

 

SQLモードをNO_ZERO_DATEに変更する

SQLモードをNO_ZERO_DATEに変更することでエラーを回避できます。

NO_ZERO_DATE モードは、サーバーが '0000-00-00' を有効な日付として許可するかどうかに影響します。 この影響は、厳密 SQL モードが有効かどうかにも依存します。

引用: 厳密な SQL モード

 

テーブルを作成する前にSQLモードをNO_ZERO_DATEに変更することで、テーブルを作成することができました。

SET sql_mode = 'NO_ZERO_DATE';
CREATE TABLE `invoices` (
  `id` int(10) NOT NULL AUTO_INCREMENT, PRIMARY KEY(id) COMMENT 'ID',
  `email` varchar(256) NOT NULL COMMENT 'メールアドレス',
  `created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '登録日',
  `updated` datetime NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '更新日'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='ユーザー';

コメント