K先生个人博客

当前位置:首页 > 爱技术 > 正文

mysql外键怎么理解?读这一篇文章就够了

mysql外键是什么你知道吗?或者说知道怎么用吗?反正博主在这之前好像一直没有使用过mysql外键的,所以对于MySQL外键的理解处于“听说过”的程度,本着成为大牛的心态,怎么能不了解这一个小小的外键呢。所以学习的过程中写下了这篇文章,也希望能帮助其他对MySQL外键一知半解的小伙伴拿下这个小小的外键知识点。

MySQL外键是什么

MySQL外键就是用来建立主表与从表的关联关系,为两个表的数据建立连接,约束两个表中数据的一致性和完整性。对于两个具有关联关系的表而言,相关联字段中主键所在的表就是主表(父表),外键所在的表就是从表(子表)。

如果你现在对上面的话不是太理解,没关系,等读完这篇文章再回来读一遍,相信你肯定会有种恍然大悟的感觉的。

学习MySQL外键从创建开始:

接下来我们就通过两张表去深入了解MySQL外键,一张表是店铺表shop,一张表是商品表goods。这两张表的关系就是,一个店铺里面会有很多商品,但是一个商品只会在一个店铺里上架

创建店铺表shop:

CREATE TABLE shop (
id INT(11) PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
boss VARCHAR(20)
)ENGINE =InnoDB DEFAULT CHARSET=utf8;

image.png

因为MyISAM表引擎是不支持外键的,所以我们创建的表一定要是InnoDB!!!

创建好之后,我们向其中插入几条记录。

INSERT INTO shop (`name`,boss) VALUES('小米旗舰店','雷军'),('华为旗舰店','任正非'),('魅族旗舰店','黄章');

image.png

然后我们开始创建第二张表goods(商品表):

CREATE TABLE goods(
id INT(11) PRIMARY KEY AUTO_INCREMENT,
title VARCHAR(50) NOT NULL,
shop_id INT(11),
price INT(11) DEFAULT 0,
CONSTRAINT shop_goods FOREIGN KEY (shop_id) REFERENCES shop(id)
ON DELETE CASCADE
ON UPDATE CASCADE
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

image.png

这张表的存储引擎同样要是InnoDB。和shop表创建不一样的是我们创建的时候也同时创建了外键。

CONSTRAINT shop_goods FOREIGN KEY (shop_id) REFERENCES shop(id)
ON DELETE CASCADE
ON UPDATE CASCADE

这个就是创建MySQL外键的sql语句了,其中的shop_goods是这个外键的名称,shop_id是从表(goods商品表)关联外键的字段,而shop(id)指的就是关联主表(shop店铺表)中的id字段。ON DELETE CASCADE的意思就是删除的时候触发限制。CASCADE参数的意思是跟随外键改变而改变。当然它还有其他的参数,具体看下面说明。

CASCADE:父表delete、update的时候,子表会delete、update掉关联记录; 

SET NULL:父表delete、update的时候,子表会将关联记录的外键字段所在列设为null,所以注意在设计子表时外键不能设为not null; 

RESTRICT:如果想要删除父表的记录时,而在子表中有关联该父表的记录,则不允许删除父表中的记录; 

NO ACTION:同 RESTRICT,也是首先先检查外键;

还有一点需要注意的是,创建外键关联的两个字段数据类型一定要一致,在本例子中goods表中的shop_id和shop表中的id都是int类型是一致的。

近距离观察MySQL外键

下面从新增、删除、更新三种操作来近距离观察MySQL外键。

1、新增(插入)。

我们在主表shop店铺表中,可以随意插入数据,前面也已经插入了三条记录了。下面我们在从表goods商品表中插入数据:

INSERT INTO goods (title,shop_id,price) VALUES('小米1代',1,599);
INSERT INTO goods (title,shop_id,price) VALUES('小米2代',12,688);

分别执行这两句语句的时候会发现,第一条可以成功执行,而第二条却报错了。报错的原因也很简单就是其中的shop_id的值为12,而我们在主表中的id是没有12这个值的,所以会报错。当然我们也可以修改主表shop店铺表中的一条记录id为12,再次执行这条语句,就会发现可以成功执行了。

2、删除

我们随便删除从表goods商品表中的记录,发现是可以任意删除的,并且主表shop店铺表也不会受到影响。

但当我们删除主表shop店铺表中的记录(比如小米旗舰店)时,发现从表关于“小米旗舰店”中的记录也都随之删除了。

还记得我们创建MySQL外键的时候设置的CASCADE参数吗?它的含义前面说过了,就是随着外键改动而改动,现在应该理解这个参数的含义了。

至于其他参数这里就不一一演示了,理解了这个,其他的应该也很好理解了。

3、更新

这是goods商品表中目前的记录,而shop表中的记录还是我们刚开始插入的那三条记录。

image.png

下面我们对shop表进行更新操作,我们把魅族旗舰店的id更新为44:

image.png

然后此时goods表中的记录也随之改动了:

image.png

可以看到其中的shop_id为了和shop表中的id字段保持一致,所以也自动更新了。

当然这也是CASCADE参数的效果,其他的参数这里也不再演示了。

结语

读完这篇文章希望小伙伴能对MySQL外键有一个新的理解。如果还是不懂的话,推荐去B站看一下这个老师的视频MySql学习之第十知识点MYSQL外键约束这么好用

作者K先生本文地址http://www.gold404.cn/info/123

版权声明:本文为原创文章,版权归 K先生个人博客 所有,欢迎分享本文,转载请保留出处,谢谢!

文章评论

* 必填
可选
可选

评论列表

  • mysql优化一下网站的后台速度就快了,但是我的网站知道什么原因,打开慢。大家试试http://www.qzj2.com/game/

    2021-10-24 11:01 来自chrome浏览器 回复
  • 很好的知识,学到了

    2021-10-13 10:39 来自chrome浏览器 回复
    • muhammed.5722372 游客http://www.vip7388.com/

      2021-10-23 16:09来自Chrome浏览器

  • 学习到了,

    2021-10-09 11:08 来自chrome浏览器 回复
    • muhammed.5722372 游客http://www.vip7388.com/

      2021-10-23 16:09来自Chrome浏览器