1.7.3.2 外键约束

外键让您可以跨表交叉引用相关数据, 而外键约束有助于保持这种分散的数据的一致性。

MySQL 支持and 语句中的ON UPDATEandON DELETE外键引用 。可用的参考操作有 (默认)、、和。 CREATE TABLEALTER TABLERESTRICTCASCADESET NULLNO ACTION

笔记

NDB不支持 ON UPDATE CASCADE引用列是父表主键的操作。

SET DEFAULT也受 MySQL 服务器支持,但目前被 InnoDB和 拒绝为无效NDB。由于 MySQL 不支持延迟约束检查,NO ACTION因此被视为RESTRICT. 有关 MySQL 支持的外键的确切语法,请参阅 第 13.1.17.5 节,“外键约束”

MATCH FULL, MATCH PARTIAL, 和MATCH SIMPLE是允许的,但应避免使用它们,因为它们会导致 MySQL 服务器忽略同一语句中使用的任何ON DELETEor 子句。选项在 MySQL 中没有任何其他效果,它实际上全时强制执行语义。 ON UPDATEMATCHMATCH SIMPLE

MySQL 要求对外键列进行索引;如果您创建一个具有外键约束但在给定列上没有索引的表,则会创建一个索引。 例外:NDB 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 表外键的信息也可以在 数据库 中的表INNODB_SYS_FOREIGNINNODB_SYS_FOREIGN_COLS表中找到。INFORMATION_SCHEMA