勉強したことのメモ

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でINSERT時にオートインクリメントではないカラムに連番を登録する方法
MySQLでINSERT時にオートインクリメントではないカラムに連番を登録する方法

MySQLでINSERT時にオートインクリメントではないカラムに連番を登録したい ...

phpmyadminからプロセスの停止
phpmyadminからプロセスの停止

重たいSQL文を叩いた際、どうにも処理できず メモリ使用率が100%から下がらな ...

MySQLでホスト指定しても正常に接続できない場合
MySQLでホスト指定しても正常に接続できない場合

MySQL自体は動いており、ユーザーも登録されているのに、ホスト名を指定しても正 ...

MySQLでユーザー作成時にエラーが発生
MySQLでユーザー作成時にエラーが発生

SSHからrootアカウントでMySQLにログインし、ユーザーを作成しようとする ...

MySQLにてSELECT時にdate型のカラムから和暦を計算し表示する方法
MySQLにてSELECT時にdate型のカラムから和暦を計算し表示する方法

MySQLにdate型のカラムに誕生年月日が格納されており、そこから和暦を計算し ...