MySql使用外键(8.0)

使用外键约束

Mysql默认使用的是innoDB引擎,该引擎是支持外键的,下面来说说如何创建外键及各种外键使用的效果。

基本概念

需要注意的是外键不支持虚拟构造出的列上。

MySql支持外键,允许跨表交叉引用相关数据,有助于帮助保持数据的一致性。在create和alter表中的语句如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

-- 中括号内是非必写的
[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

CREATE TABLE child (
id INT,
parent_id INT,
-- 定义索引
INDEX par_ind (parent_id),
-- parent_id关联parent表中的id字段
-- 如果父表删除了,则子表也需要删除字段内容
FOREIGN KEY (parent_id)
REFERENCES parent(id)
ON DELETE CASCADE
) ENGINE=INNODB;

-- 添加外键
ALTER TABLE tb1 ADD FOREIGN KEY (parent_id)
REFERENCES parent(id)
ON DELETE CASCADE

-- 删除外键
ALTER TABLE tbl_name DROP FOREIGN KEY fk_symbol;

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 ACTIONRESTRICT的作用相同,都是在在修改或者删除之前去检查从表中是否有对应的数据,如果有,拒绝操作。

但是有些数据库系统会有延迟检查功能,会导致NO Action 会延迟检查是否有对应数据,但是MYSQL外键的检查是立即执行的,所以RESTRICT和NO ACTION是完全相同的

SET DEFAULT

需要注意的是,set default只是MySQL 解析器认可,但是InnoDB和NDB 拒绝在定义表时,出现ON DELETE SET DEFAULT or ON UPDATE SET DEFAULT 语句。

-------------本文结束感谢您的阅读-------------

本文标题:MySql使用外键(8.0)

文章作者:NanYin

发布时间:2019年07月11日 - 15:07

最后更新:2019年08月12日 - 13:08

原始链接:https://nanyiniu.github.io/2019/07/11/2019-07-11-%E4%BD%BF%E7%94%A8Mysql%E7%9A%84%E5%A4%96%E9%94%AE/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。