MySQL 8.0 リファレンスマニュアル


1.7.3.2 FOREIGN KEY の制約

外部キーを使用すると、複数のテーブルにわたる関連データをクロス参照することができ、外部キー制約は、この分散したデータの整合性の維持に役立ちます。

MySQL は、CREATE TABLE および ALTER TABLE ステートメントにおける ON UPDATE および ON DELETE 外部キー参照をサポートします。 使用可能な参照アクションは、RESTRICT, CASCADE, SET NULL および NO ACTION (デフォルト) です。

SET DEFAULT は MySQL Server でもサポートされていますが、現在、InnoDB では無効として拒否されています。 MySQL は遅延した制約のチェックをサポートしないので、NO ACTIONRESTRICT として扱われます。 外部キーについて MySQL によってサポートされる正確な構文については、セクション13.1.20.5「FOREIGN KEY の制約」を参照してください。

MATCH FULLMATCH 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 テーブルでは、外部キーがサポートされます。


関連キーワード:  制約, テーブル, TABLE, KEY, FOREIGN, SCHEMA, サポート, InnoDB, NAME, インデックス