转自:https://www.cnblogs.com/chenxiaohei/p/6909318.html
数据库(外键及其约束理解)
一:首先是外键的定义
如果一个字段X在一张表(表一)中是主关键字,而在另外一张表(表二)中不是主关键字,则字段X称为表二的外键;换句话说如果关系模式R1中的某属性集不是自己的主键,而是关系模式R2的主键,则该属性集称为是关系模式R1的外键。
二:主键表和外键表的理解
(1)以公共关键字作主键的表为主键表(父表,主表)
(2)以公共关键字作外键的表为外键表(从表,外表)
举个例子:
这里有2张表(student和depart)学生表和院系表,这里的字段departNum就是学生表的外键,这里的外键表是学生表,主键表是院系表。


四:外键的作用
各种书籍和网上的资料大多都是抽象空洞的解释:保证数据的完整性和一致性。
个人对此的理解与接下来的外键约束一起讲。
五:外键约束
1、CASCADE:级联
(1)所谓的级联删除,就是删除主键表的同时,外键表同时删除。
(2)以上面的例子将就是,假如院系表中的某个院系被删除了,那么在学生表中要想查询这个被删除的院系号所对应的院信息就会报错,因为已经不存在这个系了,所以,删除院系表(主键表)时必须删除其他与之关联的表,这里就说明了外键的作用,保持数据的一致性、完整性。当然反过来讲,你删除学生表中的记录,并不影响院系表中的数据,你查询院系号也能正确查询。所以删除外键表中的数据并不影响主键表。
NO ACTION和RESTRICT的区别:只有在及个别的情况下会导致区别,前者是在其他约束的动作之后执行,后者具有最高的优先权执行。
六.实际应用
对象模型中的数据如下:
这里设计对象模型时的属性并不是设计成departNum这个外键,而是整个Depart对象,这样做的好处是在查询时,就不用通过外键或者连接查询再多查询一次
若要通过外键查询:
Query query=session.createQuery("from Student as stud where stud.depart.departNum=:num"); query.setString("num","890");
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/176517.html原文链接:https://javaforall.net
