使用外键约束
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 语句。