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でデータの集計時に1日の起点を任意の時間に変更する方法
MySQLで1日毎の集計を行う際、例えば2020/01/01のデータは2020/ ...
-
-
MySQLにて指定したカラムがNULLもしくは空の場合、あらかじめ決めておいた内容で表示する方法
何らかのフォームとMySQLを組み合わせた際に任意入力の項目はそのカラムがNUL ...
-
-
MySQLで指定したカラムの中央値を抽出する方法
MySQLで指定したカラムの中央値を抽出したいというケースがあった。MariaD ...
-
-
MySQLでINSERT時にオートインクリメントではないカラムに連番を登録する方法
MySQLでINSERT時にオートインクリメントではないカラムに連番を登録したい ...