当前位置: 首页 > 后端技术 > Node.js

Mysql入门第5课《外键约束》

时间:2023-04-03 22:43:39 Node.js

原创在我的Github上,欢迎订阅。其他文章:Mysql入门第一课《建表、改表、删表》Mysql入门第二课《数据类型》Mysql入门第三课《数据的增删改》Mysql入门第四课《查询数据》前言外键约束是mysql提供的表与表之间的关联,使用吧以确保数据的一致性和完整性。但是问过同事,开发中不会用到外键约束。主要原因是数据量大或者请求频繁会造成一些性能问题。在实际开发中,外键约束的功能被业务代码所取代。但这并不意味着你不需要学习它。如果你的项目数据量不是很大,使用外键约束是非常方便的。什么是外键通过之前的学习和实践,外键其实已经出现了,比如student表中:student表中包含一个class_id,它指向班级(班级表)的id,所以我们可以通过class_id来查找学生的班级信息。这时对于student表来说,class_id就是它的外键,外键字面意思就是指向一个外键。这里,指向外部类表的id外键约束加了“约束”二字。有了约束就意味着不能随意删除和修改有外键关联的表。例如:学生表和班级表是相互关联的,有约束条件。如果有一天你想删除某个班级,班级里的学生怎么办呢?默认数据库不允许你删除,因为班级里还有学生。OK,我们来实践一下,现在给student表和class表添加一个外键约束:ALTERTABLEstudentADDCONSTRAINTstudent_classFOREIGNKEY(class_id)REFERENCESclass(id);分析上面的语句:ALTERTABLEstudent:对student表操作ADDCONSTRAINTstudent_class:添加一个名为student_class的约束FOREIGNKEY(class_id):指定外键为class_idREFERENCESclass(id):类表的关联(引用)id看看结果:为了更好地理解,请查看ER图:ONDELETE和ONUPDATEONDELETE和ONUPDATE指示如何处理删除和更新。上图中,有删除和更新,这是对数据删除和更新的处理方式:NOACTIONorRESTRICT:删除或更新父表时,必须先处理子表,再删除或更新主表数据CASCADE:Yes当删除或更新父表时,同时删除或更新子表SETNULL:当删除或更新父表时,将子表设置为NULL,默认为RESTRICT。NOACTIONorRESTRICT看看是否设置为NOACTION或RESTRICT,我们尝试删除更新数据:班级表中有对应id=1的学生,我们删除这个班级:DELETEFROMclassWHEREid=1;update同理:UPDATEclassSETid=10WHEREid=1;CASCADECASCADE:删除或更新父表时,同时删除或更新子表我们来试试看。首先修改外键约束:ALTERTABLEstudentDROPFOREIGNKEYstudent_class;ALTERTABLEstudentADDCONSTRAINTstudent_classFOREIGNKEY(class_id)REFERENCESclass(id)ONDELETECASCADEONUPDATECASCADE;可以看到已经改成CASCADE了。需要注意的是,必须先删除外键约束,然后再重新生成。现在让我们删除id=2的类:DELETEFROMclassWHEREid=2;然后看班级和学生:班级表id=2的数据没了再看学生表:class_id=2的学生也一起删掉,现在尝试修改。让我们将id=1的类修改为id=10:UPDATEclassSETid=10WHEREid=1;修改成功:看看原来class_id=1的student是怎样的:class_id也改成了10SETNULLSETNULL:删除或更新父表时,将子表设置为NULL。首先,将外键约束更改为SETNULL:ALTERTABLEstudentDROPFOREIGNKEYstudent_class;ALTERTABLEstudentADDCONSTRAINTstudent_classFOREIGNKEY(class_id)REFERENCESclass(id)ONDELETESETNULLONUPDATESETNULL;为了演示方便,在student表中添加一条数据:现在我们删除id=3的班级:id=3的班级已经被删除了,再看class_id=3的学生发生了什么:从图中可以看出,由于删除了class_id=3这个班级,所以这个班级的学生没有班级,所以class_id为NULL。让我们再看看更新:UPDATEclassSETid=100WHEREid=10;上面的语句是把id=10的班级改成id=100:班级修改成功,再看这个班级的学生:原来class_id=10的学生现在没有班级,也设置了class_id为空。总结一下本文学到的是外键约束,以及外键约束的几种处理方式:NOACTIONorRESTRICT:删除或更新父表时,必须先处理子表再删除或更新主表dataCASCADE:Yes当删除或更新父表时,同时删除或更新子表SETNULL:当删除或更新父表时,将子表设置为NULL,默认为RESTRICT。