MySQLで「doesn't have a default value」エラーの対処
2026/09/14
MySQLでINSERT時に「Field 'カラム名' doesn't have a default value」というエラーが発生した。ちなみに当該カラムはdatetime形式でINSERT時は何も値を入れない(UPDATE時に入れる予定)という状況。さらに本件は複数のサーバで作業中、3台中2台は正常に動作し、残りの1台でのみ発生していた。以下に原因と対応方法をメモ。
原因
MySQLモードの「STRICT_TRANS_TABLES」というのにひっかかっていたようで、デフォルト値を設定していないカラムがあり、そのカラムをINSERT時に指定していなかったため発生した。
また、使用していたサーバはいずれも同じ会社のものと聞いていたため、MySQLのバージョンも同じかと思いきやそれは勘違いで、新しいバージョンのものでエラーが発生していた。
ちなみに以下でSQLモードを確認できる。
SELECT @@global.sql_mode; @@global.sql_mode STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
対象方法
INSERT時に正常な値を入れる
空でもいいので何らかの値を入れる。datetime型の場合は「NO_ZERO_DATE / NO_ZERO_IN_DATE」が設定されていない場合は「0000-00-00 00:00:00」指定でもOKで指定されている場合はNULL指定にする。
MySQLモードを変更する
以下でMySQLモードを変更した。ただしMySQLサーバを再起動すると元の設定に戻るため非推奨。
SET GLOBAL sql_mode = '';
MySQL側でデフォルト値を設定する
text / varchar型の場合は空でもいい。
datetime型の場合は「NO_ZERO_DATE / NO_ZERO_IN_DATE」が設定されていない場合は「0000-00-00 00:00:00」指定でもOKで指定されている場合はNULL指定にする。
参考サイト
関連記事
-
-
MySQLでテーブル構造とデータをコピーする方法
MySQLで既にあるテーブルとデータに対して実験を行う必要があった。本番テーブル ...
-
-
MySQLで特定カラムの
タグを改行コードに一括置換させる方法MySQLで特定カラムの<br>タグを改行コードに一括置換したかった ...
-
-
MySQLで月別に集計を行う。あと日付時刻関数。
現在進行形でやっているデータ集計系だけど 新たな発見があったのでメモ。 ■日付時 ...
-
-
MySQLでオートインクリメントを使用せずにグループ毎に連番を設定する方法
MySQLでオートインクリメントを使用せずにグループ毎で連番を割り振りたかった。 ...
-
-
MySQLで直近〇日、〇ヶ月、〇年以内のデータを検索する方法
他社が作成されたSQL文を見ているとDATE_ADDという使ったことの無い関数が ...