MySQL外部キー制約

3073 ワード

MySQLには、MyISAMとInnoDBの2つの一般的なエンジンタイプがあります.外部キー制約はInnoDBエンジンタイプのみでサポートされています.InnoDBの外部キー制約定義の構文は次のとおりです.
[CONSTRAINT [symbol]] FOREIGN KEY
    [index_name] (index_col_name, ...)
    REFERENCES tbl_name (index_col_name,...)
    [ON DELETE reference_option]
    [ON UPDATE reference_option]

reference_option:
    RESTRICT | CASCADE | SET NULL | NO ACTION

外部キーを使用するには、次の条件を満たす必要があります.
  1. 両方のテーブルはInnoDBテーブルでなければなりません.テンポラリ・テーブルはありません.
  2. 外部キー関係を確立する対応するカラムには、似たようなInnoDB内部データ型が必要です.
  3. 外部キー関係を確立する対応するカラムには、インデックスが作成されている必要があります.
  4. CONTRAINT symbolが明示的に与えられている場合、symbolはデータベース内で一意である必要があります.明示的に与えられていない場合、InnoDBは自動的に作成されます.
子テーブルが親テーブルに存在しない外部キー値を作成しようとすると、InnoDBはINSERTまたはUPDATE操作を拒否します.親テーブルがUPDATEまたはDELETEのいずれかのサブテーブルに存在または一致する外部キー値をしようとする場合、最終的な動作は、外部キー制約定義のON UPDATEおよびON DELETEオプションに依存します.InnoDBは5種類の異なる動作をサポートしているが、ON DELETEまたはON UPDATEが指定されていない場合、デフォルトの動作はRESTRICTである.
  1. CASCADE:親テーブルから対応するローを削除または更新し、テーブルから一致するローを自動的に削除または更新します.ON DELETE CANSCADEとON UPDATE CANSCADEの両方がInnoDBでサポートされています.
  2. SET NULL:親テーブルから対応するローを削除または更新し、サブテーブルの外部キー列を空にします.なお、これらは、外部キー列がNOT NULLに設定されていない場合にのみ有効である.ON DELETE SET NULLおよびON UPDATE SET NULLは、いずれもInnoDBによってサポートされています.
  3. NO ACTION:InnoDBは親テーブルの削除または更新を拒否します.
  4. RESTRICT:親テーブルの削除または更新を拒否します.RESTRICT(またはNO ACTION)を指定するのと、ON DELETEまたはON UPDATEオプションを無視するのと同じ効果です.
  5. SET DEFAULT:InnoDBは現在サポートされていません.
外部キーコンストレイントで最も多く使用されるのは、次の2つです.
1)親テーブルの更新時に子テーブルも更新され、親テーブルの削除時に子テーブルに一致する項目がある場合、削除に失敗します.
2)親テーブルが更新されると子テーブルも更新され、親テーブルが削除されると子テーブルが一致するアイテムも削除されます.
前の場合、外部キー定義では、ON UPDATE CASCADE ON DELETE RESTRICTを使用します.後者の場合、ON UPDATE CASCADE ON DELETE CASCADEを使用できます.
InnoDBでは、ALTER TABLEを使用して既存のテーブルに新しい外部キーを追加できます.
ALTER TABLE tbl_name
    ADD [CONSTRAINT [symbol]] FOREIGN KEY
    [index_name] (index_col_name, ...)
    REFERENCES tbl_name (index_col_name,...)
    [ON DELETE reference_option]
    [ON UPDATE reference_option]
InnoDBでは、ALTER TABLEを して キーを することもサポートされています.
ALTER TABLE tbl_name DROP FOREIGN KEY fk_symbol;
  :MySQL 5.1 Manual: FOREIGN KEY Constraints