[CONSTRAINT [symbol]] FOREIGN KEY
[index_name] (col_name, ...)
REFERENCES tbl_name (col_name,...)
[ON DELETE reference_option]
[ON UPDATE reference_option]
reference_option:
RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT
[CONSTRAINT [symbol]] 外键约束命名 InnoDB表未定义时将自动生成约束名称。
可以在create和alter语句中对列进行处理
当UPDATE或DELETE操作影响子表中具有匹配父表中的行的键值时,结果取决于ON UPDATE、ON DELETE子句指定的引用动作。引用动作包括
- CASCADE:从父表中删除或更新该行,并自动删除或更新子表中的匹配行。支持ON DELETE CASCADE和ON UPDATE CASCADE。在两个表之间,不要定义ON UPDATE CASCADE作用于父表或子表中同一列上的多个子句。
- SET NULL:从父表中删除或更新该行,并将子表中的一个或多个外键列设置为NULL。支持ON DELETE SET NULL和ON UPDATE SET NULL。如果指定SET NULL操作,请确保未将子表中的列声明为NOT NULL。
- RESTRICT:拒绝父表的删除或更新操作。指定 RESTRIC(或NO ACTION)与省略ON DELETE or ON UPDATE子句相同。
- NO ACTION:标准SQL中的关键字。在MySQL中,等效于RESTRICT。如果引用表中有相关的外键值,则MySQL服务器会拒绝父表的删除或更新操作。一些数据库系统具有延迟检查,并且NO ACTION是延迟检查。在MySQL中,外键约束会立即检查,因此NO ACTION与RESTRICT相同。
- SET DEFAULT:这个动作由MySQL解析器认可,但是InnoDB和NDB都拒绝包含DELETE SET DEFAULT或UPDATE SET DEFAULT子句的表定义。
对于支持外键的存储引擎,如果父表没有对应的值,创建子表的值时:MySQL将拒绝任何INSERT或UPDATE操作
对于未指定的ON DELETE或ON UPDATE,默认操作始终为RESTRICT
限制
不能引用自身
不支持前缀索引
不支持分区的表的外键
外键约束不能引用虚拟生成的列
BLOB并且 TEXT列不能包含在外键中
父表和子表必须使用相同的存储引擎,并且不能将它们定义为临时表
具有外键关系的表不能更改为其他存储引擎。要更改存储引擎,必须首先删除任何外键约束
外键和引用键中的对应列必须具有相似的数据类型。固定精度类型的大小和符号必须相同。字符串类型的长度不必相同。对于非二进制(字符)字符串列,字符集和排序规则必须相同。
在外键和引用的键上的索引;在引用表中必须有一个索引,其中外键列按照相同的顺序作为第一列列出。如果索引不存在,则在引用表上自动创建索引。如果您创建了另一个可用于强制外键约束的索引,则此索引可能会在稍后以静默方式删除
示例
添加外键约束
ALTER TABLE tbl_name
ADD [CONSTRAINT [symbol]] FOREIGN KEY
[index_name] (col_name, ...)
REFERENCES tbl_name (col_name,...)
[ON DELETE reference_option]
[ON UPDATE reference_option]
放弃外键约束
ALTER TABLE tbl_name DROP FOREIGN KEY fk_symbol;
确定外键约束名称
SHOW CREATE TABLE: