この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:4
ページ更新者:atom
更新日時:2026-06-11 07:07:02

タイトル: エラー&トラブル
SEOタイトル: MySQL でよくあるエラーとトラブル対処完全ガイド

この記事の要点
  • MySQL の代表的なエラー番号と対処を一覧化(1045 / 1062 / 1064 / 1146 / 1452 / 2002 / 1366 / 1093 / 1170 / 1318 ほか)
  • ERROR 1045 (28000) Access denied はユーザー/ホスト/パスワード不一致 → SELECT user, host FROM mysql.user
  • ERROR 1062 Duplicate entry はユニーク制約違反 → INSERT ... ON DUPLICATE KEY UPDATE
  • ERROR 2002 Can't connect to local MySQL server はソケット or サービス停止 → systemctl status mysqld
  • ERROR 1452 Cannot add or update a child row は外部キー違反 → 親テーブル先行投入 or FK 一時無効化

MySQL エラー番号一覧(よく出会うもの)

エラー番号SQLSTATE意味主な原因
104528000Access denied for userパスワード / ホスト / ユーザー不一致
104942000Unknown databaseDB 未作成 / typo
106223000Duplicate entryPRIMARY / UNIQUE 重複
106442000SQL syntax error構文エラー / 予約語
1093HY000You can't specify target table for update in FROM clauseUPDATE 対象を直接サブクエリで参照
114642S02Table doesn't existテーブル未作成 / DB 違い / 大小文字
117042000BLOB/TEXT used in key without prefix lengthTEXT 列を INDEX 指定(prefix 必須)
131842000Incorrect number of arguments for PROCEDURE引数の数違い
1366HY000Incorrect integer valuestrict mode で空文字を int 列に投入
145123000Cannot delete or update a parent row子レコードが残っていて FK 違反
145223000Cannot add or update a child rowFK 先の親が存在しない
2002HY000Can't connect to local MySQL serverサービス停止 / ソケットパス違い
2003HY000Can't connect to MySQL server on hostFW / port / bind-address
2006HY000MySQL server has gone awaywait_timeout / max_allowed_packet 超過
2013HY000Lost connection during query長時間クエリ / ネットワーク切断

ERROR 1045: Access denied for user

ERROR 1045 (28000): Access denied for user 'app'@'192.168.1.5' (using password: YES)

典型的なチェック:

-- ユーザー / ホスト一覧
SELECT user, host FROM mysql.user;

-- 'app'@'%' があり 'app'@'192.168.1.5' が無い場合は % が優先されないことに注意
-- パスワード再設定
ALTER USER 'app'@'%' IDENTIFIED BY 'NewPass!';
FLUSH PRIVILEGES;

-- 権限確認
SHOW GRANTS FOR 'app'@'%';

ERROR 1062: Duplicate entry

ERROR 1062 (23000): Duplicate entry 'taro@example.com' for key 'users.users_email_unique'
-- どのインデックスで衝突したか確認
SHOW INDEX FROM users WHERE Key_name = 'users_email_unique';

-- UPSERT で回避
INSERT INTO users (email, name) VALUES ('taro@example.com', 'Taro')
ON DUPLICATE KEY UPDATE name = VALUES(name), updated_at = NOW();

-- 既存重複データを集計
SELECT email, COUNT(*) FROM users GROUP BY email HAVING COUNT(*) > 1;

ERROR 1064: SQL syntax

大半は予約語の未エスケープ・カンマ忘れ・クォート不一致です:

-- ❌ order は予約語
CREATE TABLE order (id INT);

-- ✅ バッククォートで囲む
CREATE TABLE `order` (id INT);

-- ❌ クォートが閉じていない
SELECT * FROM users WHERE name = 'taro;

-- ✅
SELECT * FROM users WHERE name = 'taro';

ERROR 2002: Can't connect to local MySQL server

# サービス確認
systemctl status mysqld          # rpm 系
systemctl status mysql           # deb 系
systemctl status mariadb         # MariaDB

# ソケットパス確認
mysql_config --socket
# /var/lib/mysql/mysql.sock

# 起動
sudo systemctl start mysqld

# tcp 経由に切替(ローカルソケットが見つからない場合)
mysql -h 127.0.0.1 -P 3306 -u root -p

ERROR 1452 / 1451: 外部キー違反

-- 1452: 子に親未存在
-- 1451: 親に紐づく子が残っている

-- 一時的に FK チェックを無効化(一括 import 等)
SET FOREIGN_KEY_CHECKS = 0;
-- ... 大量 INSERT ...
SET FOREIGN_KEY_CHECKS = 1;

-- 親レコードを先に投入
INSERT INTO categories (id, name) VALUES (1, 'IT');
INSERT INTO articles (id, category_id, title) VALUES (1, 1, 'MySQL Guide');

-- 削除時は ON DELETE CASCADE / SET NULL を検討
ALTER TABLE articles
ADD CONSTRAINT fk_cat FOREIGN KEY (category_id) REFERENCES categories(id)
ON DELETE CASCADE;

ERROR 1366: Incorrect integer value

strict mode で空文字や文字列を INT 列に入れようとすると出ます。

-- strict mode 確認
SHOW VARIABLES LIKE 'sql_mode';

-- 一時的に外す(推奨しない)
SET SESSION sql_mode = REPLACE(@@sql_mode, 'STRICT_TRANS_TABLES', '');

-- 正しい修正: アプリ側で空→NULL 変換
INSERT INTO users (age) VALUES (NULL);  -- ✅
INSERT INTO users (age) VALUES ('');     -- ❌ 1366

ERROR 1093: target table for update in FROM clause

-- ❌
DELETE FROM users WHERE id IN (SELECT MIN(id) FROM users GROUP BY email);

-- ✅ サブクエリを別名でラップ
DELETE FROM users WHERE id IN (
    SELECT id FROM (
        SELECT MIN(id) AS id FROM users GROUP BY email
    ) AS t
);

ERROR 1170: BLOB/TEXT used in key without prefix length

-- ❌ TEXT 列をそのまま INDEX
CREATE TABLE posts (body TEXT, INDEX (body));

-- ✅ prefix length 指定
CREATE TABLE posts (body TEXT, INDEX (body(255)));

-- 全文検索したいなら FULLTEXT
CREATE TABLE posts (body TEXT, FULLTEXT (body));

ERROR 2006 / 2013: gone away / Lost connection

原因確認 / 対処
wait_timeout 経過で切断SHOW VARIABLES LIKE 'wait_timeout'; / アプリで再接続
max_allowed_packet 超過SET GLOBAL max_allowed_packet = 64*1024*1024;
OOM Killer に殺されたdmesg | grep -i mysql / メモリ増設・innodb_buffer_pool 調整
ロードバランサのアイドルタイムアウトTCP keepalive / コネクションプール調整

調査用スニペット

-- 直近のエラー / 警告
SHOW WARNINGS;
SHOW ERRORS;

-- ステータス
SHOW GLOBAL STATUS LIKE 'Aborted%';
SHOW GLOBAL STATUS LIKE 'Connections';

-- 実行中スレッド
SHOW FULL PROCESSLIST;

-- ロック状況
SELECT * FROM performance_schema.data_locks\G
SHOW ENGINE INNODB STATUS\G

-- スロークエリ ON
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 1;

FAQ

Q: アプリのエラーログにはエラー番号が無い
A: ドライバ層で握りつぶされていることが多い。PDOException::getCode() / mysqli_errno() で取得を。Laravel なら QueryException::errorInfo

Q: ステージングでは出ないのに本番でだけ 1366 が出る
A: sql_mode がサーバごとに違う。my.cnfsql_mode を揃え、strict 前提で開発を。