使用外键约束
Mysql默认使用的是innoDB引擎,该引擎是支持外键的,下面来说说如何创建外键及各种外键使用的效果。
基本概念
需要注意的是外键不支持虚拟构造出的列上。
MySql支持外键,允许跨表交叉引用相关数据,有助于帮助保持数据的一致性。在create和alter表中的语句如下:
1 |
|
index_name
指的是外键的标识,如果子表已经显式的定义了可以支持外键的索引(上面例子中的par_ind
),则忽略。否则,mysql会依照以下规则隐式的创建一个外键索引。
- 如果定义
CONSTRAINT symbol
值,则使用这个值,否则使用外键名index_name
. - 如果上面两个都没有定义,外键名使用引用外键列的名称。
更新/删除行为
Mysql如何使用外键来保证参照的完整性。
对于支持外键的innoDB存储引擎来说,MYSQL拒绝在子表中插入或删除在父表中没有匹配到的外键候选值。
当父表中的外键候选值发生变化的时候,根据不同的行为策略,来影响子表中对应的外键的键值。具体的策略如下:
CASCADE
【级联】
如果在父表中删除和更新数据,会自动的删除和更新子表中的匹配到的所有数据。支持删除级联ON DELETE CASCADE
和更新级联ON UPDATE CASCADE
,两个表之间,不要定义几个这样的子句,这些子句作用域父表或子表中的同一列。
SET NULL
【置空】
如果在父表中删除和更新数据,则自动的置空NULL
子表中的外键对应的字段。如果在更新或删除操作中指定了ON DELETE SET NULL
或者ON UPDATE SET NULL
时,必须保障*子表外键的那个字段没有设置为 NOT NULL
*
RESTRICT
【限制】
如果在伏笔啊哦中删除和更新数据,子表拒绝删除或更新对应字段内容。
NO ACTION
【无动作】
NO ACTION
是标准SQL中的关键字,在mysql中NO ACTION
和RESTRICT
的作用相同,都是在在修改或者删除之前去检查从表中是否有对应的数据,如果有,拒绝操作。
但是有些数据库系统会有延迟检查功能,会导致NO Action 会延迟检查是否有对应数据,但是MYSQL外键的检查是立即执行的,所以RESTRICT和NO ACTION是完全相同的
SET DEFAULT
需要注意的是,set default只是MySQL 解析器认可,但是InnoDB和NDB 拒绝在定义表时,出现ON DELETE SET DEFAULT or ON UPDATE SET DEFAULT 语句。