外部キーを使用すると、複数のテーブルにわたる関連データをクロス参照することができ、外部キー制約は、この分散したデータの整合性の維持に役立ちます。
MySQL は、CREATE TABLE
および ALTER TABLE
ステートメントにおける ON UPDATE
および ON DELETE
外部キー参照をサポートします。使用可能な参照アクションは、RESTRICT
(デフォルト)、CASCADE
、SET NULL
、および NO ACTION
です。
NDB
は、参照カラムが親テーブルの主キーである ON UPDATE CASCADE
アクションをサポートしません。
SET DEFAULT
も MySQL Server でサポートされますが、現在、InnoDB
および NDB
によって無効として拒否されます。MySQL は遅延した制約のチェックをサポートしないので、NO ACTION
は RESTRICT
として扱われます。外部キーについて MySQL によってサポートされる正確な構文については、セクション13.1.17.2「外部キー制約の使用」を参照してください。
MATCH FULL
、MATCH PARTIAL
、および MATCH SIMPLE
は許可されますが、同じステートメントで使用されるすべて ON DELETE
句と ON UPDATE
句を MySQL Server に無視させるため、これらを使用しないでください。MySQL では MATCH
オプションはほかの効果がなく、事実上常に MATCH SIMPLE
セマンティクスが強制されます。
MySQL では、外部キーカラムにインデックスを付ける必要があります。外部キー制約はあるが所定のカラムのインデックスがないテーブルを作成する場合、インデックスが作成されます。例外: MySQL Cluster には、外部キーカラムで明示的な一意キー (または主キー) が必要です。
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_SYS_FOREIGN
および INNODB_SYS_FOREIGN_COLS
テーブルにもあります。