- MySQL
MySQL ERROR 1822の直し方|外部キーとインデックス
ERROR 1822 (HY000): Failed to add the foreign key constraint. Missing index for constraint 'c86_ibfk_1' in the referenced table 'p86' は、外部キーで参照しようとした親のテーブルの列に、使えるインデックスが無いときのエラーです。 親の列に主キーか UNIQUEを付けると直ります。
-- エラー:p86.code にインデックスが無い
CREATE TABLE c86 (id int PRIMARY KEY, p_code varchar(10),
FOREIGN KEY (p_code) REFERENCES p86(code));
-- 直し方:親の列に UNIQUE を付けてから作る
ALTER TABLE p86 ADD UNIQUE KEY uk_code (code);
エラー文の in the referenced table 'p86' が、インデックスが足りない親のテーブルです。
確認環境:MySQL 8.0.46(InnoDB)(確認日 2026年10月11日)。
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「MySQL ERROR 1822の直し方|外部キーとインデックス」
1822 になる3つの形
| 形 | 例 | 直し方 |
|---|---|---|
| 親の列にインデックスが無い | REFERENCES p86(code)(code は普通の列) |
親の列に UNIQUE(または主キー) |
| 複合主キーの2列目だけを参照 | 主キーが (shop_id, item_no) で、REFERENCES p86b(item_no) |
両方の列で参照する |
| 列の順番が逆 | REFERENCES p86b(item_no, shop_id) |
主キーと同じ順番で書く |
公式マニュアルでは、参照される列が、親のテーブルのインデックスの「先頭の列」に、同じ順番で並んでいる必要があるとされています。
複合主キーを参照するとき
CREATE TABLE p86b (shop_id int, item_no int, PRIMARY KEY (shop_id, item_no));
| 子の外部キー | 結果(確認環境) |
|---|---|
FOREIGN KEY (item_no) REFERENCES p86b(item_no) |
1822(2列目だけ) |
FOREIGN KEY (shop_id) REFERENCES p86b(shop_id) |
作れた(先頭の列だけ) |
FOREIGN KEY (shop_id, item_no) REFERENCES p86b(shop_id, item_no) |
作れた(おすすめ) |
FOREIGN KEY (item_no, shop_id) REFERENCES p86b(item_no, shop_id) |
1822(順番が逆) |
「店舗ごとの商品番号」のように、2列で1つの商品が決まるなら、子も2列で参照します。 商品番号だけでは、どの店舗の商品か決まらないので、外部キーになりません。
先頭の列だけ・UNIQUE でない列の参照は、MySQL 8.4 では使えない
確認環境(8.0)では、複合主キーの先頭の列だけや、UNIQUE でない普通のインデックス(KEY idx_grp (grp))を参照する外部キーも、エラーにも警告にもならずに作れました。
MySQL 8.4 の公式マニュアルでは、このような「主キー・UNIQUE 以外」への参照は非推奨で、restrict_fk_on_non_standard_key の設定で有効にしないと使えないとされています。8.0 から 8.4 へ移すと、ここで止まる可能性があります。外部キーは、親の主キーか UNIQUE の列全体を参照するのが確実です。
似たエラーとの違い
| エラー | 起きたこと(確認環境) | 直し方 |
|---|---|---|
| 1822 Missing index for constraint | 親の列に使えるインデックスが無い | 親に UNIQUE・主キー |
| 1824 Failed to open the referenced table 'nosuch' | 親のテーブルが無い(作る順番が逆・名前の間違い) | 親を先に作る、名前を直す |
| 3780 ... are incompatible | 子と親の型・文字コード・照合順序が違う(varchar の照合順序だけ違っても出た) | 型・照合順序をそろえる |
| 1553 Cannot drop index 'uk_code': needed in a foreign key constraint | 外部キーが使っている親のインデックスを消そうとした | 先に外部キーを消す |
| 1452 Cannot add or update a child row | 外部キーを付けるとき、親の無いデータがある | データを直す |
型の違い(3780)と、親の無いデータ(1452)は、関連記事の「MySQL ERROR 1452の直し方|外部キー制約エラー」で扱っています。
テーブルを作る順番
CREATE TABLE c86x (... FOREIGN KEY (p) REFERENCES nosuch(id));
ERROR 1824 (HY000): Failed to open the referenced table 'nosuch'
子のテーブルを、親より先に作ると 1824 になります。 DDL のファイルを流すときは、親 → 子の順に並べます。
SET FOREIGN_KEY_CHECKS = 0 にすると、親が無くても子のテーブルを作れました(SHOW CREATE TABLE に外部キーが残った)。ただし、そのあと親を正しく作らないと、外部キーが機能しません。
子のテーブル側のインデックスは自動で作られる
(FOREIGN_KEY_CHECKS=0 で作った c86z の SHOW CREATE TABLE)
KEY `p` (`p`),
CONSTRAINT `c86z_ibfk_1` FOREIGN KEY (`p`) REFERENCES `nosuch2` (`id`)
子の側は、外部キーの列にインデックスが無ければ、MySQL が自動で作りました(KEY p (p)、公式マニュアルでも同じ説明)。1822 は、親の側のインデックスの問題です。
確認の手順(チェックリスト)
| 順番 | 確認すること | 方法 |
|---|---|---|
| 1 | どの親のテーブルか | エラー文の in the referenced table '...' |
| 2 | 親の列のインデックス | SHOW INDEX FROM 親のテーブル |
| 3 | 主キー・UNIQUE があるか | 無ければ ADD UNIQUE KEY |
| 4 | 複合キーか | 子も全部の列で、同じ順番で参照 |
| 5 | 1824 なら | 親のテーブルを先に作る、名前を確かめる |
| 6 | 3780 なら | 型・文字コード・照合順序をそろえる |
よくある質問
Q. 親の列に UNIQUE を付けられません(重複がある)。 A. 重複しているなら、その列はそもそも1行を決められず、外部キーで参照する対象になりません。主キー(id)で参照するように設計を見直すか、重複を整理してから UNIQUE を付けます。重複の探し方は、関連記事の「MySQL ERROR 1062 Duplicate entryの直し方」で扱っています。
まとめ
- 親の列に、使えるインデックスが無いエラー。親に UNIQUE・主キーを付ける
- 複合主キーの2列目だけ・順番が逆でも 1822。全部の列を、同じ順番で参照する
- 8.0 では先頭の列だけ・普通のインデックスの参照も作れたが、8.4 では非推奨・既定で使えない
- 親のテーブルが無いのは 1824、型・照合順序の違いは 3780、使っているインデックスを消すと 1553
- 子の側のインデックスは自動で作られる。問題は親の側
参考・出典
確認日はいずれも 2026年10月11日です。
- MySQL 8.0 Reference Manual「FOREIGN KEY Constraints」:https://dev.mysql.com/doc/refman/8.0/en/create-table-foreign-keys.html
- MySQL 8.4 Reference Manual「FOREIGN KEY Constraints」:https://dev.mysql.com/doc/refman/8.4/en/create-table-foreign-keys.html
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「MySQL ERROR 1822の直し方|外部キーとインデックス」
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。