1.7.3.2 外键约束

外键允许您跨表交叉引用相关数据,外键约束 有助于保持这些分散数据的 一致性。

MySQL 在 CREATE TABLEALTER TABLE 语句中支持 ON UPDATEON DELETE 外键引用。可用的引用操作是 RESTRICTCASCADESET NULLNO ACTION(默认)。

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

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

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

您可以从信息模式 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_FOREIGNINNODB_FOREIGN_COLS 表中找到。

InnoDBNDB 表支持外键。