MySQLで外部キー制約を一時的に無効化する

  • MySQL
  • SQL

この記事は、構成と文章の整理に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 に戻すこと。戻し忘れたままセッションが切れれば自動的に元に戻るが、同じ接続を使い回す場合は明示的に戻すのが安全。