1.7.3.2 外键约束

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

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 表支持外键。