MySQLでの『エラー1364: Field Doesn’t Have a Default Value』を解決する方法
このエラーは、MySQLでレコードを挿入しようとした際に、必須フィールドに値が設定されていない場合に発生する。特に、STRICTモードが有効になっている場合に顕著に表れる。この記事では、エラーの発生条件から具体的な解決手順、対応策の選択肢までを詳しくまとめる。
エラーの内容と発生条件
Error Code: 1364. Field 'column_name' doesn't have a default valueこのエラーは、以下の条件で発生する:
- テーブルのあるカラムが
NOT NULL制約を持っている - そのカラムに
DEFAULT値が設定されていない INSERT文でそのカラムに値を明示していない- MySQLがSTRICTモードで動作している(
STRICT_TRANS_TABLESなど)
再現用のサンプル
以下のテーブルを用意して、値を一部省略して挿入する場合を考える。
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL,
email VARCHAR(100) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- emailを省略
INSERT INTO users (username) VALUES ('taro');この場合、email にデフォルト値がなく、NOT NULL 制約があるため、エラー1364が発生する。
原因1: NOT NULL制約とDEFAULT値の未設定
このエラーの多くは、NOT NULLなカラムに値を指定していない場合に起きる。以下のような構造が原因:
email VARCHAR(100) NOT NULLこの状態で email を INSERT 文に含めなければ、デフォルト値が無いためエラーとなる。
解決策1: DEFAULT値を明示的に設定
もっとも簡単な方法は、該当カラムに DEFAULT 値を与えること。
ALTER TABLE users MODIFY email VARCHAR(100) NOT NULL DEFAULT '';これにより、INSERT 時に email が指定されなくてもエラーにならない。
解決策2: STRICTモードを無効化
開発や一時的な対応としては、STRICTモードを無効にする方法もある。
一時的に無効にするには:
SET SESSION sql_mode = '';
-- または
SET SESSION sql_mode = 'NO_ENGINE_SUBSTITUTION';永続的に変更するには、my.cnf または my.ini に以下を記述:
[mysqld]
sql_mode=NO_ENGINE_SUBSTITUTIONその後MySQLを再起動する。
解決策3: INSERT文で全カラムを明示する
INSERT 時にすべての NOT NULL カラムに値を指定することで回避できる。
INSERT INTO users (username, email) VALUES ('taro', 'taro@example.com');データがあるなら明示的に入れるのが最も堅実。
原因2: ORMやフレームワークでの省略
LaravelやRailsなどのORMでは、自動的にカラムが省略されることがある。その際、意図せず NULL のまま送信され、STRICTモード下でエラーとなる。
この場合は、モデルやマイグレーション側でデフォルト値の指定を検討する。
補足: STRICTモードの確認方法
現在のSQLモードを確認するには以下のクエリを使用する。
SELECT @@sql_mode;結果に STRICT_TRANS_TABLES や STRICT_ALL_TABLES が含まれていれば、STRICTモードが有効。
補足: NULLを許容する選択肢
要件上、値がなくても問題ない場合は、NULL を許容することで対応できる。
ALTER TABLE users MODIFY email VARCHAR(100) NULL;ただし、アプリケーション設計的に問題がないかは事前に検討する。
補足: デフォルト値と意味的整合性
DEFAULT '' や DEFAULT 0 を設定すると、エラーは回避できるが、データとして意味のない値になる可能性がある。本質的な対応が必要な場合もあるため、ビジネス要件に照らして判断する。
まとめ
MySQLの「Error 1364: Field Doesn’t Have a Default Value」は、主にSTRICTモードとNOT NULLカラムに値を与えなかったことが原因。根本的な対応としては、テーブル設計やINSERT文の見直し、あるいはSQLモードの調整が挙げられる。開発初期段階では柔軟に対応しつつも、本番環境ではデータ整合性を優先すべき。
-
前の記事
MySQLのエラー『エラー144:Table is Marked as Crashed』の解決方法 2025.05.30
-
次の記事
PostgreSQLでの『could not connect to server』エラーの解決方法 2025.05.30
コメントを書く