【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という項目が全部ゼロの日付を許可してないようす。
(qiita.com)phpMyAdminのエラーコード#1067を解消する方法
https://qiita.com/kaitaku/items/185d15c4ef1a49fb5ef0
管理人の環境では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年に人類がいるか知りませんけどね(笑)
11.2.2 DATE、DATETIME、および TIMESTAMP 型
https://dev.mysql.com/doc/refman/8.0/ja/datetime.html
あとがき・まとめ
- テーブル作成時のエラー#1067・デフォルト値が無効について、my.iniでNO_ZERO_DATEが指定されている(無効日付)
- CURRENT_TIMESTAMPを入れても良い
- データ型のTIMESTAMP型サポート範囲は2038-01-19 03:14:07 UTC
まとめると、こんなところでしょうか。2038年はサーバーが64ビットだと避けられるかなーと思っていましたが、格納するデータ型が対応してないケースは、今のうちに押さえられてよかったです。
【カテゴリ】- サイトエラー対策と復旧
【タグ】- データベース