00:00
好,同学们,咱们接着呢往下讲啊,前面呢,我们说到了这个叫,哎,这个nono啊,Unique primary key,还有这个auto INC equipmentment啊,接着呢,我们来看一下这个叫foreign key啊,我们称为呢叫外进约束啊,这个我们讲了这么多约束了啊,包括呢,我们后边呢,还有这个叫check约束和这个default约束,就是这么多约束里边呢,如果我们说有一个约束呢,比较麻烦一些,嗯,相对呢,大家难理解一些,那么应该呢,指的就是我们这个叫外进约束了。啊来,我们看一看这个外径线数呢,是什么意思啊,为什么说它呢,比较麻烦一些啊,不管是从定义上来讲,还是从大家理解上来讲呢,会稍微的麻烦一些啊呃,它的作用是什么呢?就是限定某个表的某个字段的一个引用完整性啊,你看这句话一说完之后呢,你就有点懵是吧?咱们在一开始讲这个引用这个数据完整性的时候呢,提到过一个叫引用完整性,说员工所在的部门在部门表中啊,要能够找到这个部门。啊,它就叫做引完整性,那这个呢,要求就是通过我们这个叫外径约束呢,来去起作用啊起作用的。
01:04
来举个例子啊,我们这有个部门表,这呢是对应的,呃,有一个部门ID啊,这呢是一个主建是吧,十二十啊这个部门的ID,然后呢,我们还有一个表呢,叫做员工表,那么员工表里边儿有一个列呢,叫做部门的ID。啊叫部门ID,我们现在呢往这个呃员工表里边呢,去添加数据啊添加数据呃,当我们添加这个,呃叫多少60号部门的时候呢,是可以的,呃,因为我们在部门表里边儿有60号部门,当你去添加这个九号部门的时候呢,你发现这个员工表呢,就不让你添加。啊,凭啥呀?诶主要原因就是因为我们这个员工表的这个department ID这个字段,它呢关联了我们部门表里边的这个department ID这个字段。在人家这个部门表里边儿就叫主建,在咱们这个员工表里边这个位置上,咱们叫做外建啊,咱们通过这个外建呢,关联了人家另外一个表的主键,那么起作用的效果是什么呢?就是我们这个表啊,就一旦这种关联以后,咱就别这个那个了,咱把这个表呢称为呢叫主表。
02:04
这个员工表呢,咱们称为呢叫从表,或者呢,上面这个我们称为呢叫父表,这个呢,我们称为呢叫做子表。好了,那我们有了这样一个关联关系以后呢,咱们就要求什么呀,你这个从表当中添加数据的时候呢,这个值必须呢,是我们这个主表当中这个字段中已经存在的值啊,如果你要不存在就不让你加啊,实际上也很好理解,就跟咱们说的,你随便你加了一个部门叫九号部门,根本就没这个部门,你怎么加呀,就不允许了,对吧?哎,就这个意思,这儿呢,就咱们说的这个外建。啊,大家一想哦,这个也挺简单的哈,其实整个约束呢,也都没有那么复杂,只是我们相对来说呢,这个外建比其他几个呢要麻烦一点啊就这个意思,好,那刚才呢,我们也引入这几个概念了,主表和从表,副表和子表,对吧?那比如说呢,刚才提到了一个部门表呢,就是主表,员工表呢就是从表,那么还有比如说像学生表、课程表和这个选课表,那这几个里边呢,像咱们选课表里边呢,呃,就是涉及到了说哪个学生选的哪个课啊课呢有课程ID,学生呢有学生的ID,那这个学生ID跟课程ID你不能乱写了,它是不是都得对应着,呃,你这个学生的ID得在学生表里边能找到,这个选课表里边的课程ID呢,得在课程表里边能找到,那么学生表跟课程表是不是就主表啊,选课表呢,就是这个从表。
03:20
对吧,还有这个概念。像下面呢,关于咱们这个外径因素呢,你看哎,这个我写了只有九条啊,关于它的说明啊,关于它的说明,哎,咱们稍微简单的看一下啊,说从表的这个外键列啊,必须得引用或参考主键啊,主表的这个,这个键的这个,呃,主表的这个,诶把这个去了,主表的这个主键或者唯一约束的这个列。那这个呢是对的,就是相当于什么意思啊,就我先把这个里边的要求咱们先说清楚啊,一会儿咱们可以演示,就相当于呢,咱们这个员工表里边的这个字段呢,咱们是加了个外键,关联上我们部门表里边这个部门ID,这个要求,我们这个部门ID呢,它必须上边生命有一个主见约束,或者呢叫唯一性约束。
04:03
啊,必须得二选一,你要这块什么约束也没有呢,这块你一关联他就报错了啊,这要注意说为什么有这样呢?因为他要求被依赖呢,或者被参考的这个质上你得是唯一的,你比如我这块呢,添加60号部门的,你这块呢,找就只能找到一个流失,你别一找啊,找了好几个不合适啊,这个注意。行,这是这个。然后呢,下边说在创建外界约束的时候呢,如果不给这个外界约束呢,去命名啊,不命名的话呢,默认呢,它也不是列名啊,不像我们前面讲的那是吧,它也不会有不是这个列名了,然后它会自动的产生一个外界名,那就比较可能比较特别一点了,咱们建议大家的话呢,就显示的给他起上个名啊。好,下边在创建表的时候呢,这个就指定外建约束的话呢,需要先创建主表,再创建从表,那就是说我们要是给这个,呃,员工这个表呢,在创建这个表的时候,就指明外建,那你得先把这个部门表造出来,因为我们在造这个员工表的时候呢,直接就说外建需要关联那个表,另外这个表的主表的哪个列,你主表得先有是吧?哎,得先找主表啊这个意思。
05:03
删表的时候呢,需要先删从表,再删主表,为啥呀?啊,就是比如说我们这两个表呢,我不想要了,先在有这个外径约束,我们要先删这个,嗯,先删谁啊,先删这个从表再删主表。啊,为什么,大家想想。你看是不是这个道理啊,如果我们要是这两个有外径因数了,咱们先删这个主表的话呢,你想想他能删成功吗?比如说我们删成功了,你想想,呃,咱咱举的那个啥一点,咱就别把这个表中所有记录都删了,咱就删一条吧,比如说我就把这个60号部门的这个数据给删掉了,如果删成功了,你想想是不是就意味着我们这个员工表里边儿是不是你存在着60号部门的记录,但是呢,又没有这个部门,那岂不是不满足外界约束的条件了呀?啊,那同样的道理,你要把这个全删了,那这块呢,这些这不数据全都找不到对应的,哎部门ID了嘛,哎就不满足外界约束了是吧,所以呢,你怎么着啊,你可以这么着哈,我们先把这个60号部门的员工呢全都删掉,然后呢,我们这个表里边儿是不是就允许你把这个60号部门删了呀。
06:04
哎,是这个道理。诶,我这块一一说大家都能理解这个概念,对吧?啊,那我们我演示也好,还有有的小细节我可能没有演示,大家呢,下来也可以自己呢去操作一下啊,都没有问题的。好,这块说当主表的记录呢,被从表参照时呢,主表的记录将不允许被删除,那刚才我说过这个事儿了,是吧?如果要删除的话呢,需要先删除从表中依赖的该记录的数据,然后再删除主表,就像我刚才说你删60号部门的员工,然后你再删60号部门,对吧?好在从表中指定外径约束啊,并且呢,一个表可以建立多个外径约束啊,没问题的,没问题的,像咱们前面讲查询的时候呢,是不是这个老师讲这个员工表,员工表部门表是吧,实际上在员工表里边它有好几个外径人数啊,其中这个呢,关联上我们这个depend ID,这是一个,还有呢,我们是有一个叫赵白D啊。啊,大家还有印象吧,这个job ID呢,就关联了那个叫哎,Jobs那个表的啊,那个表里边一个jobd,还有我们这个员工表里边呢,咱们还有个字段呢,是不是叫manage ID啊。
07:06
啊,当时咱们还讲过每一个major ID呢,是不是都一定是一个employd啊,因为每一个管理者都是公司的一份子是吧?那相当于这个major ID呢,它还关联了他自己的,诶你看还可以自关联哈,他关联他自己的employed。通过这个呢,我们能看到是什么呀,就是我们这个外径约束的这个字段,跟这个主表中的这个字段,没有说这俩字段的名必须得完全一样。啊,名可以不一样,比如说我们这呢,叫department ID,然后我们这个呢,完全可以叫做,比如说叫DEP啊,下划线ID啊,这是可以的啊,就名可以不一样,但是。啊,But特是吧,但是什么呢?类型必须一样。那比如我们这个呢,是一个int类型的,你这块你别整个叉类型,或者这个word叉类型,这就不合适了。那它这块你在关联的时候呢,它就会报错了啊,设置外约束的时候报错了,本身的话呢,你想想你这也不能你表示的都是这个部门ID,你怎么可能这个是int,那个是差呢,对吧?哎,你名可以不一样,就像我们这里边这个呢,叫管理者ID啊,这个所有的管理者ID一定是在员工的ID里边能找到记录的啊,所以这块呢,我们就有一个外界的一个关联,那关联的就是这个员工ID啊,这个名可以不一样啊,好,就是这个事儿。
08:17
啊,你看下边就说这个问题了啊,数据类型不一样,名呢可以是不相同的,OK,下边说当创建外进约束时,系统会默认的在这个列上呢建立一个对应的一个索引啊上面我们讲主键约束也会造索引,这个微型约束呢也会造索引,只不过呢,这个外径约束对应的索引呢,是一个普通的索引了。啊哎,普通的索引,然后我们去删除这个外界约束的话呢,这个索引呢,你注意它不会给我们主动的删掉的,我们还得手动的,哎,这块我们加一个啊,你得手动的去删除一下你这个对应的索引,就如果你索引也不想要的话啊,你去手动的删除,OK,行,那这呢,我们就做了一些解释,那下边的话呢,我们就来演示一下刚才说的这样的一个过程,看是不是如此,好这是我们说的第七个啊,咱们说的叫。
09:04
哎,Foreign key对吧,哎,我这块呢,再把这个粘一下。啊CTRLC好再拉下来啊这张呢,我们这个代码量呢,就稍微的大一些了,行,那首先呢,我们说这个7.1,哎,咱们呢是哎在啊在什么呀,在create table啊时添加。没问题是吧,哎,刚才呢,咱们看到一个细节点啊,咱们首先呢,提到一个概念是什么呀,叫主表。啊,提到一个主表和呃从表是吧,啊这是这一组这个词还有一个呢,哎,叫什么词啊啊附表是吧。父表,父,父亲的父啊,父表呢和什么呀,叫子表。那这样一个概念,那么这里边儿呢,咱们要求是不是得先创建什么呀,是不是主表啊。哎,先创建这个叫A主表,好,那这块我们就来举例子了啊,我就来写啊,这个咱们是在8.0当中,哎,这个DD t13里边咱们去测试,首先呢,我们去create一个table啊,咱就比如说叫dept吧啊,这个叫部门表啊,在这里边我们叫dept啊ID啊是个in类型的,然后呢,再来一个DEP name啊是一个what类型的事物,好哎,我就这么着,好注意一下啊,我刻意呢,这里边没有给这个字段呢,加上主键或者唯性约束。
10:26
行,那我们选中了执行。没问题对吧,行,那接下来的话呢,我们去create一下,这个叫table啊,我们呢去叫E吧。咱们这里边儿有过PE了吗?F5刷新一下。啊,没有好,还好没有啊行,那这块我们先要创建主表,然后再创建总表。这个我们是这个第一小步。啊,第二步啊,在在创建从表。OKOK,好,那这时候我们叫emp啊,然后我们也简单一点,那比如说我们这有一个员工的啊,EP的一个ID啊,是一个in特类型的啊,这个呢,你愿意加主见就加主键啊,这个跟咱们目前讨论的这个还不是主要的矛盾啊,Primary key啊,Autorement,这都是小事。
11:16
Auto。啊,Rement是吧,很好,呃,这个呢,其实不影响我们现在是这个外建啊,呃,然后接着的话呢,我们再来一个emp的一个name吧,啊,员工的一个名。那whata,这个我们来一个十五行,接着你看我刻意的我这块叫department ID啊,我就故意的跟这个呢名不一样了,这个呢是一个因特类型的啊,没问题是吧?好,那下边我们通过使用叫表级约束的方式来写吧。来大家注意看,这个呢,就涉及到我们该如何去定义这个叫外径约数了,哎,咱们写一个长的啊。嗯,一口气下来哈,这个比较长,说constraint起个名叫foreign key。啊,这个FK呢,叫foreign key啊,不是大家可能FK想的另外一个单词啊,哎,叫foreign k,然后呢,E当中的呃,DEPTD这个字段呢,我们给它设置成是一个foreign key对吧。
12:14
OK,然后呢,接下来指明啊,Foreign。诶,这个foreign啊,这个就是外国人啊,Foreigner啊呃,Foreign key啊,外建有点像呢,咱们说这个呢,是一个国家,这是一个国家,相当于这个国家呢,通过比如说这个字段呢,跟这个国家关联,这就像一个外交官一样,是吧?哎,Foreign key啊,你就这样去想就行,呃是作用在谁上呢?是department ID上。哎,我这块呢,就直接粘过来了,是这意思吧,好还没完事啊,我们为什么要先创建主表呢?就是因为我们在造这个从表中的这个外径约束的时候呢,咱们后边呢,要关联上你这个主表,所以你得先你得先造这个主表对吧。后边呢叫references。啊,这个单词有点难写啊,References啊,谁呀,我们DEP啊一这个表里的啊叫DEP。
13:07
你看有点长啊,哎,这个。哎,稍微的记一记。好,那这样呢,我们就写完了,写完以后的话呢,现在咱们去把这个总表呢,我要去创建一下了,大家注意看,这时候能成功吗。来,咱们跑一下。是不是就报错了呀,哎,就报错了,哎这个报错的原因是什么呢?是因为咱们这个主表要求你关联的这个主表当中这个字段呢,必须得是一个主键,或者呢,你是一个唯一性约束的一个键啊咱们现在呢,是不是,哎啥也不是了,哎那就不行。那那就不行是吧?哎,那我们下边是不是要给它添加一个这样对应的主键约束啊,那怎么添加啊,咱们前面是不是也讲过,哎,怎么添加主键约束,我们可以通过是不是叫al table的方式去添加添加呀。在哪儿呢?咱们写的这有点多了。那在这是吧,哎,这时候呢,我们直接呢,就艾一个primary key啊,你告诉我是谁啊就可以了啊就这么着好,那这块呢,我们就需要呢,补充一下啊,上述操作报错啊,因为在主表中的啊第PT。
14:12
啊,ID。不是,哎,或者这个第一批一上是吧,没有主见约束。啊或啊唯一性约束啊。那么这个第三步呢,我们去做一个添加。那这个添加。好,那这时候我们是不是就用这个alter了是吧?Alter table我们叫DEP,然后ID叫primary。T啊,我们针对的是咱们的叫depd,哎,是不是这样就可以了,好,这个我们说的主见约束呢,你也别起名了,因为它这个,哎,是不是大家都叫这个,呃,Primary这个名是吧?好,我们选中了执行。此时的话,我们来一个de一下啊DEP。哎,我们选中啊执行,哎,你看此时的话呢,是不是就有pray啊pri这样一个标识了,然后在这种情况下呢,我们再去执行啊,我们从表的创建操作啊,CTRLC,嗯,这个呢,咱们说是失败了啊,这块咱们再写一个,这叫四。
15:15
啊,这样。哎,把这个。嗯,再来。来创建啊,这个从表好,那此时的话呢,我们把它选中,咱们做一个执行。好,大家看是不是此时呢就可以了呀,那就是我们彻底的就成功了啊,彻底就成功了,那成功以后的话呢,我们也可以呢,哎,CTRLC咱们粘过来de一下叫EP。啊,我们这时候呢,选中啊执行,那此时的话呢,我们看到哎说主键啊这呢,你看有一个ull啊,针对是它这个呢,你好像不是特别明确说这个是个什么键了啊,哎,我们可以在这块F5刷新一下在这个位置啊在这个位置你看这块呢,是不是又给我们显示。啊,这个foreign key是吧,这个意思啊好,那这是一个图形化界面的方式,或者的话呢,大家就使用咱们一开始讲到的,咱们可以是不是通过这样的一个指令啊的方式也可以是吧。
16:07
啊,从我们这个叫information stemmer这样一个数据库当中,我们找这样一个表,啊找谁呢?咱们现在找的是MP1啊来这是我们选中的做一个执行。那一方面的话呢,我们这个EPE表里边儿,咱们自己定义了一个主件,那我们是不是还定义了一个这个外键。啊,没有问题啊,没有问题,好,那这呢我们就说到这儿了,那接下来的话呢,我们就要演示一下它的一个基本使用啊,演示外键的一个效果。啊,显示一个外径效果,这个咱们称为呢,叫6.2吧。啊,上面是这个6.1。啊啊,7.1啊,7.2啊。那演示这个外形效果呢,注意我们现在呢,如果是想是想往这个员工表里边去加数据,你觉得我能加进去吗。你看啊,我insert into一下咱们EPE啊,我就直接在这values啊,这个ID呢,我就1001吧。然后那个员工名啊,叫Tom这个部门的ID呢,我写的十号部门,大家觉得我这时候能成功吗?啊,你看我们一执行啊,这时候你看就报错了。
17:08
说呢,我们不能够添加或者修改一个child row,这个child肉呢,指的就是我们这个呢,是不是叫子表啊,所以就是子表中的一个行,哎,不能添加,为什么呢?因为你有个外键的一个约束失败了。啊,主要原因就是因为我们现在是不是根本没有十号这个部门啊啊这呢,我们说叫哎添加失败,哎添加失败了行,那么接下来我们呢,再怎么做呀,咱们就是这么着insert啊into咱们第1PT1。啊,针对于我们这个表,然后呢,我们哎Y64,哎我们来一个十号部门,咱们来一个,比如说叫按it部门的是吧?哎,我们选中了做个执行。哎,可以了,诶。它的啊de PT啊一好,我们做一个执行。可以了,那么在这种情况下呢,我们再去。添加这个员工啊,我们走一下,哎,你看此时呢,是不是就成功了啊,我们说在啊这个主表啊,第1PT1中啊添加了。
18:10
哎,这个十号部门以后。那我们就可以,嗯在哎从表中。哎,是不是我们添加这个。这个哎,十号部门的员工啊,哎,这就可以了,哎,上面这个错误啊,这个知道是什么原因造成的就可以了,行,那么在这个情况下呢,大家你想一想,我们如果呢,是做一个delete from什么呀,DEP1啊说where。啊,咱们这个叫de PT。ID啊,等于谁啊,等于十,我们能不能把这个部门表里边十号部门呢,给它删掉呢,是不是显然也是不可以的呀,还说你不能够删除或者更新一个这个主表中的一个行,因为有个外径约束呢,失败了啊,这个我们说也是叫删除失败啊,这个大家应该也能理解啊,就是我们如果要是删除成功了。
19:01
是不是就是一个相当于一个反正法呀,是吧。如果你要是成功了的话呢,哎,你想想,如果你要是成功的话呢,是不是我们员工表里边就有一条记录,诶十号部门,但是在部门表里边就没有这条,哎,就没有这个部门,相当于你这个外界因素呢,就没起没起作用嘛,是吧?啊所以这个就不行啊,包括呢,你看我们来一个什么呀,我叫update。Update dept1啊,然后呢,Set一下啊,我们这个呃,十号部门,我改成20号部门。嗯,这个十号部门我把它改成,哎把这个去了,把十号部门呢,我们改成20号部门行不行,是不是也不行啊,哎,你看这个错误信息呢,跟刚才呢,都是一样子的,这呢我们叫一个啊叫更新失败。哎,更新是吧。咱们前面呢,讲这个数据处理之增删改啊,数据处理之增删改这一章的时候呢,咱们当时其实提了一下说呢,有的时候呢,我们天删改这个操作呢,是是会失败的啊,当然失败的原因呢,有很多种啊,就是说呃,幸福的家庭都是相似的不幸各有各的不幸,是吧?啊你想写一个词后语句写错,那太容易了,你一个符号错了,它就错了。
20:10
啊,当然呢,我们这里边儿主要想强调的点就是呃,语法呢也没有问题,为什么不让删,为什么不让更新,诶,这里边我们会涉及到一个关联的问题。啊,关联的问题就是我们以主呃以这个外径约束为例呢,就给大家说明了一下,这个天山改有的时候呢,都会这个失败是吧?哎,这个大家要注意一下这个问题啊。好,这呢,咱们就把这个外结约束的这个事儿呢,基本上就给大家就说清楚了。啊,能够去理解这个问题吧。啊,OK的是吧,好,那这个说清楚以后的话呢,嗯,咱们再给大家说什么呢?就是这个线标以后呢,呃,如何去添加约束,这个其实也相对比较简单,那说一下也行啊,咱们从完整性上来讲,因为其他约束咱们都讲了,这个没讲也不好,咱们也讲一下,最后来一个7.3啊说呢在叫al是吧。
21:00
嗯,在out table时。哎,我们呢,怎么着啊,哎,添添加这个外径元素。啊,其实这个也非常简单啊,非常简单,嗯,在auto table的时候呢,添加,那就意味着你首先这个表是不是都已经有了呀。好,那这块呢,咱们再拿一组例子来说吧。嗯,我这么着,嗯,在上边这块啊,CTRLC一下。这个呢,咱们叫部门二吧,这块我就直接呢,就加上这个primary k了,嗯,这呢是一个主键,这没问题是吧,好,我们选择执行。嗯,可以啦,然后呢,咱们把这个员工表呢,咱也给他造出来啊,我就这样啊CTRLC。这个我们叫一个二。OK吧,123这样三个字段,好,我们选择呢执行。嗯,这时候也可以了,行,然后呢,我们先来跑一下这个。诶,这个咱们那个,哎,这个是吧,查询我们这个表中的它对应的这个约束,我们找一个e p2啊选择我们去做个执行,现在的话呢,它只有一个主键约束啊没有问题,然后呢,我们看一下啊out table。
22:11
那叫EP2。看N片二,然后呢,我们是不是想添加一个外径约数啊,I的一个外径约数,这怎么加呀?哎,实际上这个添加呢,跟咱们一开始在造表的时候的这种加法呢,其实是一样的啊,你就把这个粘过来,其实修改一下这个相应的名就行啊啊这块大家可能有的不熟,那我就再写一遍啊爱叫conscentratet啊深吸一口气啊,这个稍微有点长啊嗯,这个这个这个是foreign key是我们EPR这个表里的。啊,这个DEP这个字段,我们加的一个叫foreign key。啊,Foreign key,嗯,然后呢,它是作用在我们这个字段上啊,有同学可能说,哎,说这个宋老师你咋能把这个都记住啊,这么长是吧?哎,这个呢,大家就多写就可以了。
23:00
啊S啊。嗯,关联谁呢?就是多写写你就记住了啊de pt2,然后这个表里的叫de PT啊下划线ad,那这就可以了。这个封一下来,我们把这个呢,选中咱们跑一下子。就可以了,然后咱们再去查看一下这个表中这个哎约束是吧,哎此时呢,你看是不是就有了。没有问题啊,这就有了,嗯,就是咱们讲了这么多约束了,嗯,每一个约束呢,咱们都讲了一下,在al table的时候怎么去添加啊,包括怎么去删除,但是建议大家的话呢,你就呃在造表的时候呢,会去加就行。啊,就是一般呢,咱们在更新的时候呢,去操作这个机会少一点,就是在造表的时候呢,就想清楚到底有什么约束,你就该加的都加好,就不用你再去auto table的时候再去修改了,是这意思吧。好的啊行,这个呢,我们就说清楚了,这个说清楚之后呢,咱们给大家再讲一个啊,在这个基础之上呢,有一些难度的问题。来看课件啊。嗯,我们找到往下走,哎,在这啊叫约束的等级。
24:06
啊,这个呢是相当于诶,我们其他这个点来讲的话呢,这个外径约束里边呢,稍微难的一个事儿啊,这块大家注意听啊,这个在我们实际开发当中呢,如果你要是用外径约束的话呢,我们是可以考虑用这个约束等级的,或者通常我们都可以去加上的。啊就这个意思来看一下这个呢,叫cascat这个方式,什么叫cutcat方式呢?如果诶就是首先呢,基于大家先把我们上面那个讲的这个先理解了啊,哎,咱们上面讲的那个场景,就比如说你主表中想删,主表中想更新,想这个添加,呃,让不让添加,让不让更新是吧,这样的问题啊。呃,那。这个这个看什么呢?就是在这个附表上呢,你要是去更新或者是删除记录的时候。同步的更新或者是删除词表中的记录。这种模式呢,叫做cascat模式,什么意思?我们刚才呢,演示的时候,你发现更新和删除是不是都不行,咱们删12部门是吧?那这个呢,如果你要用的这种模式呢,当我们想更新啊,十号部门的那个部门的话呢,呃,你要把十号部门改成20号部门了,就是咱们这个第1PD表啊DP这个表,如果你想这样更新的话呢,同步的我们这个员工EP啊一这个表中的那个12部门呢,也就改成22部门了。
25:20
你要把这个12部门给删了呢,那我们12部门的员工呢,就也自动的被这个就fire掉了。啊,这个呢,叫cascade模式。啊,有点意思是吧,那什么叫sign道模式呢,就我们附表当中进行update或者delete的时候呢,子表中的这个列呢,被设置成照啊,你比如说我们这个部门表里边呢,我想把这个十号部门呢,给他这个改成20号部门。那你这样改完之后呢,我们员工表里边这个十号部门的员工呢,咱们就改成闹了。如果你要把这个部门表里边这个十号部门呢,给删掉了,现在这个部门呢给撤销了,那这个员工的话呢,不会给他这个,呃,这个这个同步的。呃,去去抵delay药,而是呢,给他呢叫设置个闹,现在这个员工呢,没有开除,但是呢,他目前的部门呢,是一个闹。
26:03
哎,这个呢,就是赛道的一个模式啊。啊,那我们上边演示的时候呢,发现是不是相应的,你想更新想删除都不行,那因为咱们没有做任何的操作,你可以理解什么呢?叫做no action的方式,就是如果词表中有记录呢,附表就不允许去做这个操作,咱们刚才那会儿演示的其实是它是吧,那这种模式呢,其实也相当于呢,叫啊restrict啊这样的一个方式啊,就相当于它是比较严格的检查的方式。啊,还有这个叫set default这个方式啊,这个咱们就不具体去看了啊,那么这里边儿的话呢,大家主要关注一下叫cascat和这个sign no啊这两种方式咱们用的呢,相当于是一个no action,或者你说叫一个严格的模式也行。啊,下边的话呢,我给大家做一个其中一种情况的演示啊,咱们做其中一种情况的演示,哎,我先把这个事呢,CTRLC一下咱们粘过来,这个咱们讲的叫约束的这个等级问题。啊,等级问题,哎,这个我就哎这样啊。
27:01
嗯,行,这个我们先把这事呢先抛到这儿,然后下边呢,我们来做一个具体的演示。这个大家呢,你就没必要自己去演示了,你就看一下我这里边演示一个场景就行啊,哎,我这演示的场景就行,那这里边提到了我们开发中建议大家用什么,这个咱们一会儿再说啊,我们演示呢,就演示这个事儿,这个代码的话呢,咱就直接拿过来跑就行啊,这个大家其实不太难理解。哎,我们演示谁呢?我们update的时候呢,我用的是cacade,我们delete的时候呢,用的是赛no。啊,就是我们更新呢,比如说更新部门表,那员工表就跟着更新了,你要删除这个部门表中一个部门呢,然后那个员工呢,就这个给删闹了啊就这个意思,好,那我们来演示啊,哎,首先我们把这两个CTRLC。哎,咱们拿过来。赶过来。哎,因为比较简单,大家一看呢就明白啊,这呢是我们造了一个部门啊,我们这里边F5刷新没有过这个de pd行没问题。啊,这个呢,叫部门ID啊,部门的一个名称啊,都没问题,选中执行。
28:01
可以了是吧,然后呢,我们再去造一个这个叫啊员工表,这呢就是这个从表了,哎,主建啊员工名对部门的ID啊,这个就比较清楚。哎,部门部门ID,然后下边这个叫外经约束,咱没有去这个con起个名了啊直接呢就是指明它关联上我们这个表里边的这个,呃,Did是吧,哎,主要呢,就看这块啊,On update casca on delete sign,哎,就是这个意思,设置好这个等级来选中。执行。可以了啊,没有问题,那下边呢,我们往这个表里边儿,咱们去添加一些这个数据,哎,我们选中。回过来。诶,往这个部门表里边,我们加上123,注意这块呢,我们要加的话呢,是不是咱就别先加它了,还是先加这个主表中对吧?哎,我们选中执行,然后再把我们这个员工表里边呢,再选中执行好,这些数据呢,我们该加都加上了,那加上以后呢,这块呢,大家做这个查询的话呢,那肯定是都能够看得到这个数据的。
29:01
啊,这个我们放到最后啊,一会儿也还要用啊,这个一会我们还要用,先查询我们这个对应的部门表啊,三条数据没问题,查询一下我们这个员工表。诶,11100110011002,就是呃,这个一二呢,张三李四呢,是在这个叫教学部,然后这个王五的话呢,是在这个叫财务部,没问题是吧。好了,下边呢,我们来演示一下这个所谓的这个要更新的操作啊,这个我们直接在这写就行了啊,来我这块去更新怎么更新的,我们update一下,咱们dept,然后我们set一下。嗯,咱们这个。嗯,我把谁改了,你看这个是不是叫1002啊,我想把这个1002呢,我改成1004啊,这个咱们对应的是不是叫did啊。啊,S did等于1004啊,说where啊,Did等于1002。能理解,下边呢,我们去做一个update,你看我们能改吗?哎,是不是改了呀,好,我们改完以后的话呢,咱们看一下这个部门表,那这块呢,很显然它是不是哎这个哎1002呢,我们改成1004了,诶关键呢,我们现在关心的是不是就这个员工表啊,他竟然让我们改成了啊,这时候你再去查看,那原来这个王五的话呢,他是在1002,你看他现在是不是在1004了,相当于做了一个同步的修改,这就是我们所谓的那叫嗯,On update叫cascat。
30:20
哎,Cut k啊,就是这样一个方式同步呢,跟着改好,那接着我们看这个所谓的这个delete这样一个行为啊,Delete这个行为。那我们delete。哎,From一下,我们看DEP啊,Where。啊,咱们就把这个did。啊,现在是不是1004了,咱们就把这个呢,记住了,给他删了,来,我们走起,那你发现呢,是不是真的删了,那我们再看一下这个部门表,那显然呢,是不是就没有1004了,然后员工表呢,王武。哎,王五这个位置呢,你看我们写的是一个闹。啊,这个呢,就是我们所谓的叫set now。啊,他没有跟着呢删掉,而是呢把它置为一个空啊,现在这个员工呢,没有把他fire掉啊,只是呢让他先待定啊,哎,这就我们说的这个意思。
31:04
啊,这个意思行,那具体的话搭配起来,你可以说on update side now on delete cascat啊或者说这块呢,其实呃,Update delete这是两种情况,然后呢,Casca和塞道也是两种情况,你可以这是不是这个组合的这样去去来啊,我就不去演示那么多种方式了啊,就拿这一种情况呢给大家去做演示了。那么这个结论是什么呢?哎,这块呢,提到这么个事儿啊,咱们粘过来。啊,这个外间这块呢,事儿比较多啊,咱们讲的这个时间呢,稍微就长了一些,哎,注意听,所以这个外径元素呢,咱们最好采用呢,On update cascade on delete啊,Restrict。哎,能理解吧,就是我们更新的话呢,建议你同步的呢,这个从表呢也做更新啊,从表也做更新,但是你要删除的话呢,最好呢,从表呢,就是如果要有记录呢,就不让他删啊,因为你得想清楚是不是删除是合适的啊,这就是建议呢,这个是用这种方式。
32:00
诶这个呢,大家稍微关注一下啊,这个呢,我们就不去演示了,大家你有兴趣呢,可以自己呢去演示一下,把这个呢设置到这儿。是吧,哎,然后这块呢,你说走一下这个过程你会发现呢,到时候删的时候呢,就不让我们删了,是吧,就这意思啊。好,那么关于这个外径因数呢,咱们还差啥呢?是不是还差去删它呀。哎,我这块呢,写的这个案例呢,情况会多一些,大家下来你看一下课件也可以。好,下面呢,我们来看一看如何去删除这个外径元素。哎,如何删除600念书咋删呢?哎,我们就out table啊,从表明直接drop这个primary key。哎,你把这个Y约束名呢给他加上就行。哎,这个job primary key啊嗯,因为我们一个表中是可以有多个外建的啊,多个外建的啊,你像咱们这块。哎,我把这个呢,CTRLC一下。那这个咱们说这个我先先这块标一下这个号啊7.5。那先这么着啊,咱们先说删除吧,外建约束,哎,这块呢,我们先说一下一个表中。
33:06
哎,可以声明有,哎多个这个外径约束啊,哎张过来,嗯,比如说呢,咱们我这么找一下啊,Use一下,咱叫艾特硅谷DD,咱不是有这个数据库吗?那我这块呢,去选中啊切换一下数据库,然后把这个位置呢,我们改成叫employees对吧。然后呢,我们选中呢,做一个执行,当然你会发现呢,你看我们此时呢,在这个呃,Employees这个表当中,你看外径约束呢,你看这是不是就仨呀,我那会儿也提到过一个呢,是咱们。呃,这没有说对应的列了啊,哎,针对我们这个第department ID,还有这个招牌ID,还有这个magic ID啊,这块呢,就有好几个啊,所以说呢,我们在去删除的时候呢,你需要呢,指明你想删的是哪一个。不像我们说job primary key删除主键啊,就不用说明了,因为就一个嘛,这个你得指明一下。OK,然后另外呢,又提到了说我们这个,呃,生命外界约束的时候呢,它还对应着有一个普通的索引,呃,你要索引也不想要了,你是把这个索引呢,也给它删一下。
34:04
对吧,那就是我们说的这个意思啊,嗯,那咱们删吧。删咱们针对于谁呀啊,我这块先CTRLC一下啊,咱们再切换回来DB test13。啊,先切换回来。嗯,回来了啊,然后呢,我们针对于咱们那会儿叫EP。一把。看也行,二也行,来我们走一下这个表里边呢,这是不是我们所说的这个叫外径约束了,那下边咱们不想要了啊,我们就开删除外径约束。啊,这个今天呢,咱们讲的这个外径约束这一章呢,哎,大家看这个代码也好,看我们这个笔记也好,哎课件也好,其实就有点相当于是像个字典一样了啊这个大家哪一块不会的时候呢,你就过来查询就行啊,这块我写的足够清楚啊。删除外键约束,那我们叫al一个table啊,嗯,E1VA,然后呢叫drop啊for。
35:01
啊,Foreign key起个名啊,这块呢,是不是都把这名都写这了啊foreign key。嗯,然后呢,是E这个dept ID是这样,哎,我们选中,哎执行一把。想删掉了,删掉以后呢,我们这时候再去做一个查询,哎,你看这时候就没有了。哎,这就删除外径因素对吧,然后呢,你也可以呢,是不是嗯在嗯手动的呃删除谁呀。啊,是不是我们说这个外键约束,呃,对应的这个,哎,普通的一个索引啊,我们到下边的时候呢,再讲索引的事儿,嗯,那首先我们看一看这个有没有索引这块呢,有一个指令叫show index from,这个表明。啊,这个就可以了,来收。哎,Show index啊,From,这呢,我们叫眼皮吧,选中头起。大家看,那关于这里边呢,你看这块还写的这个betra,这就我们说的这个B加数的意思啊,嗯,这呢是主键啊EPIID,然后这块呢,你看这对应的是我们这个叫department ID,哎,相当于这上面呢,确实还是有这个约束的啊,有约束怎么删呢?那这块呢,提供我们这个思路了,叫out table啊,这个表明drop index啊,索引名来我们走起out table啊,燕皮drop index。
36:18
注意,这时候我们是写这个名呢,还是写这个名呢?看写谁呀?Department ID来选中以后呢执行。啊,这个去照说不让我们去删,哎,我们这会儿再看一下。Department ID是哎,我们要删这个呢。看删哪个对呀。这个呢,是不是就它啊来我们CTRL一下看CTRLV还选中。到一起。还可以了啊,相当于我们这块拿的还是这个约束名去删的是吧,来我们这时候呢,你再去我们走一下谁呀。走这个吧,诶再走一下,诶发现的就删掉了啊,这块我们删的话呢,还是得依照于这个叫什么呀,外界约束的名去删,而不是拿这个列名来删的。
37:03
是这意思吧?那按说呢,到此为止,咱们约束呢,是不是就完事了呀?啊,还没完事啊,大家注意听,最后这块呢,是精华。啊,最后这块是精华。怎么讲,来看一下在开发当中,我们这个外界因素到底要不要用的问题。诶同学说,诶老师怎么还讨论这个问题呢啊,这个还真得讨论一下,咱们在前面讲过非空讲过唯一性约束讲过这个主见约束,在课发中这三个呢,我们呃需要用的话呢,尽量都要用上,尤其这个主键元素是一定要有的啊,一定要有的啊,因为它直接影响的一个主键索引,影响到我们表呢去存储的一个必加数的结构,对吧。好,那么我们这个外径因素到底要不要用呢?来,我们先看几个问题。第一个。如果两个表之间有关系,一对一啊,一对多呀,比如员工表跟部门表。他们之间是否一定要建立外界呢?哎,也不是,以前咱们也没讲外建时候不也照样用嘛,是吧?员工表工程表咱们employees departments咱们用的也挺嗨的是吧?那也没说有外建的事啊,哎,所以不是的是吧,下一个说见和不见外建有什么区别呢?
38:13
啊,区别就在于说你要建了外建的话,你的操作啊,比如我们天山改数据的时候呢,就会受到限制了。那你要不建外建的话呢,就没有这个限制啊,咱们不是提到一个叫引用完整性的一个问题吧。对吧,那你要是嗯不见外界,我们难道就不可以去体现这个引用完整性吗?啊也可以,那怎么着啊,啊一种呢,是靠这个成员自觉啊,就比如说我们这个部门里边有十号部门,有十二十号部门,你现在添加个员工,非要填30,这个你自己呢,就自觉一点,你就别填30了。啊,这叫自觉,但是通常这个自觉这个事儿,我们说不靠谱啊。啊,因为你要部门多的话呢,这谁能记得住啊,啊那怎么办呀?哎,我们可以在这个应用层面上去做一个限制。啊,应用层面,比如我们不都是客户端对接到我们这个,比如Java的后台。比如我们用Java呢来写这个后台啊,然后呢,我们再把这个数据呢,呃,去这个增删改到我们的数据库当中,那么在我们这个应用层面的话呢,我们比如说用一个内存中的集合去保存一下,到底有哪些部门啊,我们先看一下你要添加这个部门呢,在不在我们这个集合当中,如果你找一下在,那我们就让你添加,如果你要不在就不让添加,这是不是在我们代码逻辑当中也可以呢,去体现这个应用完整性啊。
39:23
诶是没有问题的啊,那么见跟不见,呃,外径约束跟查询有没有关系呢?跟查询是没有关系的啊,跟我们增删改有关系,好,那下边呢,就有一个小的一个结论了,说在MYSQL里边啊,外径约束啊,它是有成本的,需要消耗系统的资源。啊,对于大并发的测库来讲呢,可能不太适合,因为大家你想我们这员工表,这部门表,有可能他还有很多的这个外接哈,我们现在前往员工表里去插,插入数据,但是呢,他还得需要呢去关联的,呃,其他的这些表里边呢,都得去做一个关联啊,比如我们这还有这个jobs表啊,咱们不是那个讲查询的时候那些表嘛,这是部门表,这是jobs表,可能还有其他的有好多外界我们往这个员工表里边填一条数据,你发现还得去这里边做一些验证。
40:07
啊,这边边的数据呢,可能也很多,那么在这种大并发的搜购场景下的话呢,就会有这种阻塞的行为,会影响我们的性能。啊,由于外界约束的这个系统开销呢,而变得非常的慢,那建议呢,我们在应用层面呢,去做这个检查,就不要怼到这个数据库这个层面去做。啊,这就我们这个结论,那咱们呢,这块呢,同样的,哎,咱们再寄出阿里的这套规范。阿里有一个强制的要求。怎么着呢,不得使用外界与及联啊,一切外界的概念呢,必须在应用层去解决,也就是咱们前面提到的,你在你Java层面呢,去做这个判断。啊,什么叫集联这块呢,解释咱们其实上面都讲到了是吧,学生表里边一个CID呢,是主建,哎,成绩表里边这个呢,就是外建了,如果你要更新学生表里边CID,同时触发成绩表里边这个CID的更新,这叫级联的更新,它上面都讲了哈,说外键与级联呢,它适合于叫单级低并发,不适合于分布适合高并发集群的这个场景,你要这样急连的操作的话呢,导致强阻塞,还有可能叫更新风暴。
41:10
啊,极度影响我们插入的这个速度,所以呢,最终结论啊,讲了半天外径约束,最终结论的话呢,就是说诶,MYSQL数据库给我们提供了这样的功能,用于让我们体现。引用的完整性啊,但是在实际开发当中,我们在应用层面呢,去解决这个数据的完整性,而不是通过数据库中的外界啊,为什么,因为诶把这块呢一说是不是就完事了。啊,这个大家如果在面试当中关于外建这块这样一讲,是不是就突然就呱大上了,这个呢,实际上也可以作为咱们下篇当中,咱们在设计这个数据库的时候啊,咱不是要讲成奖励优化的话呢,其实有好多的场景啊,那其中这儿呢,也可以作为我们的一个场景,就是呃,你这个表中要不要设置这个外建的问题。好,OK,咱们关于外界呢,就说到这儿。
我来说两句