新人がハマるMySQLエラーランキング
MySQLのエラーは「壊れた」わけではありません。
ほとんどの場合、MySQLが間違っているのではなくこちらの前提が間違っているだけです。
そしてMySQLの特徴は、エラー文が親切なようで分かりにくいことです。
メッセージは正しいのに、何を直せばいいのか分からない。
ここでは、実務で本当によく遭遇するMySQLエラーをランキング形式で紹介します。
すべて実際の現場で繰り返し発生するものです。
第7位:Unknown column
ERROR 1054 (42S22): Unknown column 'user_name' in 'field list'
最初に遭遇するエラーです。
「カラムが存在しない」と書いてありますが、必ずしもカラム名のミスとは限りません。
典型的な原因:
- テーブルエイリアスの付け忘れ
- JOIN先のカラム参照
- サブクエリのスコープ誤解
例:
SELECT name FROM users u JOIN orders o ON users.id = o.user_id;
この場合 users ではなく u.id が正しいです。
つまりMySQLは「カラムが無い」のではなく、参照可能な範囲に無いと言っています。
第6位:Table doesn't exist
ERROR 1146 (42S02): Table 'app.user' doesn't exist
よくあるのはスペルミスではありません。
原因は大抵これです。
- データベースをUSEしていない
- 本番と開発でDB名が違う
- Linuxの大文字小文字問題
MySQLはOSのファイルシステムの影響を受けます。
Linuxでは users と Users は別テーブルです。
開発(Windows)では動き、本番(Linux)で落ちる典型例です。
第5位:Duplicate entry
ERROR 1062 (23000): Duplicate entry '10' for key 'PRIMARY'
主キーやUNIQUE制約違反です。
単純に見えますが、実務では厄介です。
原因の多くはアプリのバグではありません。
- 二重送信
- リトライ処理
- トランザクションの誤解
特にWebでは、ユーザーが更新ボタンを連打すると発生します。
MySQLは正しく拒否しています。
つまりこのエラーはアプリ設計の問題のサインです。
第4位:Lock wait timeout exceeded
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
突然出て、再実行すると通るエラーです。
原因はロック競合です。
別のトランザクションが同じ行を更新中です。
BEGIN; UPDATE users SET point = point + 1 WHERE id = 1; -- 別セッションも同じ行を更新
MySQLは壊れていません。
整合性を守るために待っています。
対処はSQL修正ではなく
- トランザクションを短くする
- 更新順序を統一する
です。
第3位:Data too long for column
ERROR 1406 (22001): Data too long for column 'name'
文字列長超過です。
しかし単純に長すぎるとは限りません。
典型例が utf8mb4 です。
VARCHAR(255) に 255文字入ると思いがちですが、
絵文字は4バイトです。
インデックス長制限に引っかかり、INSERTが失敗します。
これは文字数ではなくバイト数の制限です。
第2位:Incorrect datetime value
ERROR 1292 (22007): Incorrect datetime value: '2025-00-01'
日時の不正値です。
新人が混乱する理由は「前は動いていた」からです。
MySQLのSQLモード(STRICT)が有効になると、曖昧な日付を拒否します。
古いMySQL:
0000-00-00 を許可
新しいMySQL:
エラー
つまりバグが顕在化しただけです。
第1位:Cannot add or update a child row (Foreign key constraint fails)
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails
最も時間を溶かすエラーです。
意味は単純です。
「親が存在しない」
つまり参照先テーブルにデータがありません。
INSERT INTO orders(user_id, price) VALUES(999, 1000);
users に id=999 が無ければ失敗します。
よくある誤解は「INSERTの順番は関係ない」です。
外部キーがある場合、順序は重要です。
最後に
MySQLエラーの多くは難しい問題ではありません。
難しく見えるのは、エラーが「DBの問題」に見えるからです。
しかし実際には、
- データの前提
- トランザクションの理解
- 参照関係
といった設計の問題が表に出ただけです。
エラーはトラブルではなく、仕様の説明です。
メッセージを翻訳するのではなく、「MySQLが何を守ろうとしているか」を考えると、解決は早くなります。