级联操作

Posted yonyong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了级联操作相关的知识,希望对你有一定的参考价值。

 说到级联删除不得不先说一下外键,外键的定义:“如果公共关键字在一个关系中是主关键字,那么这个公共关键字被称为另一个关系的外键;换而言之,如果关系模式R中的某属性集不是R的主键,而是另一个关系R1的主键则该属性集是关系模式R的外键”。 

        建立外键的sql语句:

1 foreign key(idB) references A(idA)

 

  

        从语法分析也可以看出:外键是一种表之间字段值的引用关系。

        主表和从表

        主表和从表:以另一个关系的外键作主关键字的表被称为从表,具有此外键的表被称为主表。说白了就是:主表是被引用的表,外表是引用其他表的表。

        那么外键有什么作用?外键作用可以说是:保持数据一致性,完整性,关联性,主要目的是控制存储在外键表中的数据。就是当你对一个表的数据进行操作,和他有关联的一个或更多表的数据能够同时发生改变,避免无效或是无用的改变和孤立的数据。

        建键原则:

       1、 外键字段为主键
  2、 所有的键都必须唯一
  3、避免使用复合键
  4、外键总是关联唯一的键字段

        外键约束事件触发。既然有外键约束,当违反约束时会发生什么?我们把它的反应看作事件,一共有四种:

        1、级联:当主表更改时,从表跟从更改。

        2、不执行任何操作。

        3、设置null。

        4、设置默认值。

         我的看法

         这些听着挺玄,我说说自己的看法:主表、从表和外键的定义:我把我的笔记本借给你用,可以把“我”当作是主表、“笔记本”当作外键、“你”当作从表,就是说“你”在使用(引用)“我”的“笔记本”;外键的作用就是:现在你想把我的笔记本卖了扔了送人(增加更新删除等),得看看我允许不允许,我想搬家走人,你不把笔记本还给我,我不能搬;建键原则:借之前首先咱得说好了,我只有这么一台笔记本,你也最好是也只借了我这台笔记本,避免你也借了别人的笔记本,不知道哪个是我的了。事件触发:我说你赶紧把笔记本还给我,你可以选择还给我,可以选择不搭理我等。总而言之,由于这笔记本,“你”和“我”关联起来,这台笔记本怎么样,不能一个人说了算。

简单实例

        说了这么多,咱先说个简单的实例:建立两个表t_main和t_branch,并设置外键。语句的意思是t_main中的id是t_branch 的外键。

 1 create table t_main  
 2 (  
 3      id int primary key,  
 4      [content] varchar(100) not null  
 5       
 6 )  
 7 create table t_branch  
 8 (  
 9     mainId int Primary key ,  
10     [content] varchar(100) not null,  
11     foreign key(mainId) references t_main(id)  
12 )  

 

        执行语句,现在我想直接在t_branch中插入一条数据insert into t_branch values(3,‘分支表‘),提示如下:INSERT 语句与 FOREIGN KEY 约束"FK__t_branch__mainId__4F7CD00D"冲突。该冲突发生于数据库"beidaqingniao",表"dbo.t_main", column ‘id‘。

       我想删除t_main语句drop table t_main,提示如下:无法删除对象 ‘t_main‘,因为该对象正由一个 FOREIGN KEY 约束引用。

        在这两个表中,该外键的作用是,t_main中没有的外键值t_branch不能插入,而t_branch 正在引用t_main所以也不能只先删除t_main,否则t_branch中的数据会被孤立。我觉得,外键对主表的作用更倾向于不能删除,而对从表的作用更倾向于不能随便添加。

级联删除

       但是如果想级联删除怎么办?总结出三种办法。

       sql语句修改设置:因为默认的外键触发是“不执行任何操作”,所以我们可以使用sql语句更改设置:

 

1 FOREIGN KEY(id)REFERENCES tabley(id) on delete cascade on update cascade   

 

        意思是从表会跟随主表的改变而改变。

以上是关于级联操作的主要内容,如果未能解决你的问题,请参考以下文章

jqery对于select级联操作

如何在 EF 代码优先中禁用链接表的级联删除?

Django实现数据级联操作

VSCode自定义代码片段——git命令操作一个完整流程

2018.11.4 Hibernate中多对多的关系

VSCode自定义代码片段15——git命令操作一个完整流程