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期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ

RJCで一緒に開発しながら、 成長を楽しみませんか?