1.8.3.2 外键约束

外键使您可以跨 table 交叉引用相关数据,并且外键约束帮助保持此扩展数据的一致性。

MySQL 在CREATE TABLEALTER TABLE语句中支持ON UPDATEON DELETE外键引用。可用的参照动作是RESTRICT(默认值),CASCADESET NULLNO ACTION

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

允许MATCH FULLMATCH PARTIALMATCH SIMPLE,但应避免使用它们,因为它们会导致 MySQL Server 忽略同一语句中使用的任何ON DELETEON UPDATE子句。 MATCH选项在 MySQL 中没有任何其他作用,实际上会强制全时执行MATCH SIMPLE语义。

MySQL 要求对外键列进行索引;如果创建具有外键约束但在给定列上没有索引的 table,则会创建一个索引。

您可以从INFORMATION_SCHEMA.KEY_COLUMN_USAGEtable 中获取有关外键的信息。此处显示了针对该 table 的查询示例:

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)

关于InnoDBtable 上的外键的信息也可以在INFORMATION_SCHEMA数据库的INNODB_SYS_FOREIGNINNODB_SYS_FOREIGN_COLStable 中找到。

InnoDBNDBtable 支持外键。