外部キーを使用すると、複数のテーブルにわたる関連データをクロス参照することができ、外部キー制約は、この分散したデータの整合性の維持に役立ちます。
MySQL は、CREATE TABLE
および ALTER TABLE
ステートメントにおける ON UPDATE
および ON DELETE
外部キー参照をサポートします。 使用可能な参照アクションは、RESTRICT
, CASCADE
, SET NULL
および NO ACTION
(デフォルト) です。
SET DEFAULT
は MySQL Server でもサポートされていますが、現在、InnoDB
では無効として拒否されています。 MySQL は遅延した制約のチェックをサポートしないので、NO ACTION
は RESTRICT
として扱われます。 外部キーについて MySQL によってサポートされる正確な構文については、セクション13.1.20.5「FOREIGN KEY の制約」を参照してください。
MATCH FULL
、MATCH PARTIAL
、および MATCH SIMPLE
は許可されますが、同じステートメントで使用されるすべて ON DELETE
句と ON UPDATE
句を MySQL Server に無視させるため、これらを使用しないでください。 MySQL では MATCH
オプションはほかの効果がなく、事実上常に MATCH SIMPLE
セマンティクスが強制されます。
MySQL では、外部キーカラムにインデックスを付ける必要があります。外部キー制約はあるが所定のカラムのインデックスがないテーブルを作成する場合、インデックスが作成されます。
INFORMATION_SCHEMA.KEY_COLUMN_USAGE
テーブルから、外部キーに関する情報を取得できます。 このテーブルに対するクエリーの例を次に示します。
mysql> SELECT TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, CONSTRAINT_NAME
> FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
> WHERE REFERENCED_TABLE_SCHEMA IS NOT NULL;
+--------------+---------------+-------------+-----------------+
| TABLE_SCHEMA | TABLE_NAME | COLUMN_NAME | CONSTRAINT_NAME |
+--------------+---------------+-------------+-----------------+
| fk1 | myuser | myuser_id | f |
| fk1 | product_order | customer_id | f2 |
| fk1 | product_order | product_id | f1 |
+--------------+---------------+-------------+-----------------+
3 rows in set (0.01 sec)
InnoDB
テーブルの外部キーに関する情報は、INFORMATION_SCHEMA
データベースの INNODB_FOREIGN
テーブルおよび INNODB_FOREIGN_COLS
テーブルにもあります。
InnoDB
テーブルおよび NDB
テーブルでは、外部キーがサポートされます。