

MySQLで外部キー制約を一時的に無効化する
この記事は、構成と文章の整理にAIを使っています。
あくまで読みやすくするための補助で、内容そのものをAIにすべて任せて書いているわけではありませんが、ところどころ相談しながら整えています。
一括データ投入やマイグレーションで、外部キー制約が邪魔になることがある。そういうときは FOREIGN_KEY_CHECKS を一時的に無効化すればいい。
-- 無効にするSET FOREIGN_KEY_CHECKS = 0;
-- 有効に戻すSET FOREIGN_KEY_CHECKS = 1;スコープに注意
FOREIGN_KEY_CHECKS はデフォルトでセッションスコープの変数。つまり自分の接続内でしか効かない。別のセッション・別の接続からのDML/DDLには影響しない。
グローバルに変更したい場合は SET GLOBAL FOREIGN_KEY_CHECKS = 0; のように GLOBAL を付ける必要がある。ただしこれは全セッションに影響するので、本番環境でうっかりやると事故る。
使うタイミングと注意点
主な用途は以下のような場面。
- 大量データのインポート(順序が入り組んでいて、親子関係を無視して先に投入したい)
- テーブル構造の変更やリストア作業
- テストデータのセットアップ
無効化中は制約チェックが働かないので、参照整合性が崩れたデータが入り込む可能性がある。作業が終わったら忘れずに = 1 に戻すこと。戻し忘れたままセッションが切れれば自動的に元に戻るが、同じ接続を使い回す場合は明示的に戻すのが安全。