勉強したことのメモ

Webエンジニア / プログラマが勉強したことのメモ

MySQLで「doesn't have a default value」エラーの対処

   2026/09/14  MySQL / MariaDB データベース

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指定にする。

 

参考サイト

https://www.wakuwakubank.com/posts/414-mysql-sqlmode/

https://qiita.com/dogyear/items/75bb3d4deea1daf708c2

 - MySQL / MariaDB データベース

  関連記事

MySQLで苗字(姓)と名前(名)のカラムを結合させ検索する方法
MySQLで苗字(姓)と名前(名)のカラムを結合させ検索する方法

MySQLで名字(姓)と名前(名)をそれぞれ別カラムに格納しているデータベースが ...

MySQLで指定の順にデータをソートする方法(ORDER BY FIELD)
MySQLで指定の順にデータをソートする方法(ORDER BY FIELD)

MySQLで指定した順にソートしてデータを取り出したい。通常だと主キーだったり何 ...

MySQLにてdatetime型のカラムを整形し「年月日のみ形式」または「秒のみ省いた形式」で表示する方法
MySQLにてdatetime型のカラムを整形し「年月日のみ形式」または「秒のみ省いた形式」で表示する方法

MySQLにてdatetime型のカラムに登録日時等を格納しており、管理画面側で ...

MySQLで「server has gone~」というエラーの対応方法
MySQLで「server has gone~」というエラーの対応方法

MySQLで「MySQL server has gone away」というエラー ...

MySQLのintのカラムで2147483647の値
MySQLのintのカラムで2147483647の値

MySQLでintのカラムに数値を入れると「2147483647」という値になっ ...