1.7.3.2 FOREIGN KEY约束
外键可让您跨表参考相关数据,外键限制有助于保持这种扩展数据的一致性。
MySQL支持ON UPDATE
和ON DELETE
外键引用CREATE TABLE
和ALTER TABLE
语句。可用参照动作RESTRICT
(默认), ,CASCADE
,SET NULL
和NO ACTION
。
注意
NDB
不支持ON UPDATE CASCADE引用的列是父表的主键的操作。
SET DEFAULT
也由MySQL服务器支持,但目前拒绝通过无效InnoDB
和NDB
。由于MySQL不支持延迟约束检查,NO ACTION
因此被视为RESTRICT
。有关MySQL外键支持的确切语法,请参见第13.1.17.5节“使用FOREIGN KEY约束”。
MATCH FULL
,MATCH PARTIAL
并且MATCH SIMPLE
被允许,但应避免使用它们,因为它们会导致MySQL服务器忽略同一语句中使用的任何ON DELETE
或多个ON UPDATE
子句。MATCH
选项在MySQL中没有任何其他效果,这实际上是强制MATCH SIMPLE
语义全职的。
MySQL要求对外键列进行索引;如果您创建具有外键约束但没有给定列索引的表,则会创建一个索引。异常:NDB群集在外键列上需要显式唯一的密钥(或主键)。
您可以从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排(0.01秒)
有关InnoDB
表上的外键的信息也可以在数据库中的INNODB_SYS_FOREIGN
和INNODB_SYS_FOREIGN_COLS
表中找到INFORMATION_SCHEMA
。