MySQLでの『エラー1364: Field Doesn’t Have a Default Value』を解決する方法

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

この状態で emailINSERT 文に含めなければ、デフォルト値が無いためエラーとなる。

解決策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_TABLESSTRICT_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モードの調整が挙げられる。開発初期段階では柔軟に対応しつつも、本番環境ではデータ整合性を優先すべき。