ユーザーテーブルを作成する際に、
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'
です。
サポート範囲に入っていない、“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='ユーザー';
コメント