icon
Let's create! WordPressサイト制作とメンテ/エラー対応から、PHP/CSS/javascriptプログラミング、動画・音・イラスト等制作まで扱うコラム

【mysqlデータベース】テーブル作成時のエラー#1067・デフォルト値が無効に対処してみた

更新: 2024/10/02 1840文字

今回は、管理人が最近作っていたテストアプリケーションで、mysqlデータベース操作中に発生したエラーに対処してみます。 内容は『エラー#1067・デフォルト値が無効』というような感じ。さっそく確認していきましょう。

エラー#1067が発生した状況~テーブル作成時に『デフォルト値が無効』の表示

まずは状況を確認していきます。テストアプリケーションのuserテーブルみたいなのを想定しています。上記のようなSQLを書いてテーブル作成しようとしています。デフォルト値が設定されているカラムがlast_login(デフォルトNULL)、name(デフォルトNULL)、created_at(デフォルト0000-00-00 00:00:00)の3つです。この状態でCREATE_TABLEを実行しようとすると・・・

エラーになりました(エラー#1067・デフォルト値が無効)。

とはいっても、デフォルトNULLの部分は引っかかっていないので、created_atのデフォルト0000-00-00 00:00:00部分を調整すると対処できそうな気はします。

対応方法1~xampp/mysql/bin/my.iniのsql_mode設定

で、エラーメッセージで検索してみたところ『qiita.com』で、管理人と似たような状況になっているケースを発見。0000-00-00みたいなのが引っかかるようです。sql_modeのNO_ZERO_DATEという項目が全部ゼロの日付を許可してないようす。

管理人の環境ではxampp/mysql/bin/my.iniにありました。NO_ZERO_DATEはこれですかね。まずこれが対処方法1。

対応方法2~デフォルト値にそもそもゼロの日付が入らないようにテーブルを作る

対処方法2は、『デフォルト値にそもそもゼロの日付が入らないようにテーブルを作る』です。created_atという名前なので、レコードが入ったときのタイムスタンプが入ってもよいかなと。『0000-00-00』のようになっていたところを、『CURRENT_TIMESTAMP』にしてみます。

この場合、無事にテーブルが作成されました。

mysqlでのTIMESTAMP型の2038年問題について

気になったのでちょっと調査をしていた項目です。今回管理人はテーブル作成SQLに『TIMESTAMP型』というのを指定しましたが、mysqlのドキュメントを確認したところ、日付の範囲が『2038-01-19 03:14:07 UTC』というのがあるようです。

DATETIME型』のサポート範囲は『1000-01-01 00:00:00~9999-12-31 23:59:59』とのこと。 あと14年(2024年にこの記事書いた)とか長く使う予定なら、DATETIME型指定しておいた方がよさそうです。

ぶっちゃけ、西暦9999年に人類がいるか知りませんけどね(笑)

あとがき・まとめ

  • テーブル作成時のエラー#1067・デフォルト値が無効について、my.iniでNO_ZERO_DATEが指定されている(無効日付)
  • CURRENT_TIMESTAMPを入れても良い
  • データ型のTIMESTAMP型サポート範囲は2038-01-19 03:14:07 UTC

まとめると、こんなところでしょうか。2038年はサーバーが64ビットだと避けられるかなーと思っていましたが、格納するデータ型が対応してないケースは、今のうちに押さえられてよかったです。


【カテゴリ】- サイトエラー対策と復旧
【タグ】-

関連記事