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;
因为MyISAM表引擎是不支持外键的,所以我们创建的表一定要是InnoDB!!!
创建好之后,我们向其中插入几条记录。
INSERT INTO shop (`name`,boss) VALUES('小米旗舰店','雷军'),('华为旗舰店','任正非'),('魅族旗舰店','黄章');
然后我们开始创建第二张表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;
这张表的存储引擎同样要是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表中的记录还是我们刚开始插入的那三条记录。
下面我们对shop表进行更新操作,我们把魅族旗舰店的id更新为44:
然后此时goods表中的记录也随之改动了:
可以看到其中的shop_id为了和shop表中的id字段保持一致,所以也自动更新了。
当然这也是CASCADE参数的效果,其他的参数这里也不再演示了。
结语
读完这篇文章希望小伙伴能对MySQL外键有一个新的理解。如果还是不懂的话,推荐去B站看一下这个老师的视频MySql学习之第十知识点MYSQL外键约束这么好用
作者:K先生本文地址:http://www.gold404.cn/info/123
版权声明:本文为原创文章,版权归 K先生个人博客 所有,欢迎分享本文,转载请保留出处,谢谢!
上一篇: uni-app封装缓存过期方法
下一篇: Linux系统最新安装redis6教程
文章评论
评论列表
mysql优化一下网站的后台速度就快了,但是我的网站知道什么原因,打开慢。大家试试http://www.qzj2.com/game/
很好的知识,学到了
muhammed.5722372 游客: http://www.vip7388.com/
2021-10-23 16:09来自Chrome浏览器
学习到了,
muhammed.5722372 游客: http://www.vip7388.com/
2021-10-23 16:09来自Chrome浏览器