#### 1.7.3.2 外键约束

[](<>)

外键允许您跨表交叉引用相关数据，并且[外键约束](glossary.html#glos_foreign_key_constraint)帮助保持这些分散的数据一致。

MySQL 支持`在更新`和`删除时`外键引用[`创建表`](create-table.html)和[`更改表`](alter-table.html)陈述。可用的参考操作是`严格`,`级联`,`设置为空`， 和`无动作`（默认）。

`默认设置`MySQL 服务器也支持，但目前被拒绝为无效[`InnoDB`](innodb-storage-engine.html).由于 MySQL 不支持延迟约束检查，`无动作`被视为`严格`.有关 MySQL 支持的外键的确切语法，请参阅[第 13.1.20.5 节，“外键约束”](create-table-foreign-keys.html).

`完全匹配`,`匹配部分`， 和`匹配简单`是允许的，但应该避免使用它们，因为它们会导致 MySQL 服务器忽略任何`删除时`要么`在更新`在同一语句中使用的子句。`匹配`选项在 MySQL 中没有任何其他影响，这实际上强制执行`匹配简单`语义全职。

MySQL 要求对外键列进行索引；如果创建具有外键约束但在给定列上没有索引的表，则会创建索引。

您可以从[`INFORMATION_SCHEMA.KEY_COLUMN_USAGE`](information-schema-key-column-usage-table.html)桌子。此处显示了针对此表的查询示例：

```
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_FOREIGN`](information-schema-innodb-foreign-table.html)和[`INNODB_FOREIGN_COLS`](information-schema-innodb-foreign-cols-table.html)表，在`INFORMATION_SCHEMA`数据库。

`InnoDB`和`新开发银行`表支持外键。
