00:00
好,那关于触发器的创建的话呢,诶大家呢,你把这几个例题呢,也可以相应的去写一写啊,整体来讲呢,其实不太困难,好,那下边我们看一看这个新的这个内容就是触发器的一个查看和删除,那首先呢,涉及到这个查看,那前面呢,我们创建表啊,创建视图啊,包括创建函数这个存储过程啊,咱们也有查看和删除之说,对吧?哎,那这呢是同样的道理,那么我们如何去查看这个触发器呢?这里边呢,也提供了三种方式,第一个呢,叫做show triggers啊用个杠G来表示的啊,我们就一边说呢,咱就一边呢来给大家去演示就行啊,这是我们说,第二个说叫哎,查看触发器。那这个呢,是第一种方式啊,这我写个一。这个一二。写一个小写的一吧。嗯,这个拿过来这呢,我们能够查看当前这个数据库当中所有的这个触发器的一个定义,所以这个叫triggers,一定要小心里边有个S。啊,就用的是这样一个指令,CTRLC一下。啊,这个我们拿过来这块呢,你注意一下,在咱们这个四后要当中啊,大家就不要用这个杠G了哟,我这块呢有个小问题啊,这个大家分号不要去写,就是要么写分号,要么写这个杠J啊这要注意一下,在咱们这个SQ要当中呢,这块咱们写这个杠G呢,它不行,它识别不了。
01:13
嗯,然后这块我们选中呢,我们执行一下,那它就报错了是吧,这个它识别不了,也就是呢,我们在这个四库药当中,你要想看呢,你就用这个分号去看。但是这个呢体验呢会稍微的差一些,你看它这个特别长,可读性呢稍微差一点,咱们呢可以在这个命令行当中去看啊,我这个问二一下CMD。那首先我们去登录一下这个MY狗8.0。R u root。杠PAABC123是吧,首先呢,我们去use一下DB test。17OK啊,那这块呢,我们去写,刚才说的这个叫收。Tri,注意有这个S,你要这样哎,分号结束的话呢,就是这样查看,那可塑性还是挺差的,那你这块呢,可以来这个叫杠G是吧,来再回车。那这里边呢,你看就列举出来了,咱们当前这个数据库下呢,定义的这样的几个存储啊,这个几个触发器,第一个呢,稍微有点长,它这个就没有显示完了啊,第二个是不是咱们刚才讲定义的那个叫before insert是吧。
02:07
下边这个after insert这个。啊,这个都有触发器的这个名称啊,是一个隐射的一个事件啊是吧,针对的是这个表啊,下边是这个statement是哎begin啊下边就是我们具体的你这个触发器里边那个表达的那个结构了。Beforet什么时候什么时间创建的,哎,我们这个四科目的是什么样子的啊,这块呢,咱们到下篇的时候呢,呃,这个第一章到时候就给大家去说这个事儿,这个创建者是谁啊,相应的这个字符集呀,还有这个比较规则呀,啊都有啊,这就是它的一些基本的信息是吧?诶OK啊。哎,然后的话呢,我们来看这个第二个啊,咱们来一个这个二。哎,第二个的话呢,就跟咱们前面查看这个表啊,查看视图啊,类似叫show create啊这个trigger来,我们把这个呢CTRLC拿过来。哎,就是这样的一种方式啊,这个CTRLC。
03:00
那放到这,嗯,这个的话呢,叫show create trigger这块呢,就写我们的具体这个trigger的名称了,那比如说呢,就我们刚才创建的这三个里边,你随便挑一个就行,比如第一个吧,叫做salary。然后呢,叫check。啊,Trigger。哎,当然你会发现呢,你看咱们刚才上面讲这三道题的时候呢,咱是先说的before,后说after,是不是最后说的是这个呀?哎,当然你看这块写的是没有按照我们这个添加这个,呃,创建这个先后顺序去写啊,这个呢就注意一下,嗯,因为呢,我们具体查看的时候,刚才不也看到里边创建时间了,是吧?啊你就以那个为准就行啊,就这个呢,没有说是严格的这个先后顺序了。行,那这块呢,我们去查看一下咱们创建的这个,呃,触发器啊,走起那就在这儿了,呃,感觉可读性呢,又是稍微差一点,那你可以呢,是不是还是CTRLC一下放到我们这个,呃,命令行这块呢,大家去做一个查看啊,你过来啊,重新来CTRLC。转过来啊,这么着看啊,这个感觉也差点意思,你把这个呢,还换成这个杠G是吧,再回车,这个可读性呢就更好一点了,哎,Trigger这个触发器的名称circle mode,哎,这呢相当于是一个严格模式了。
04:07
再下边的话呢,就是我们具体的这个触发器的这个代码起啊,就是你怎么创建的啊,谁创建的啊,具体的这个,然后呢,怎么怎么着啊,下边就具体的写咱们刚才写的那些代码,那就那下边呢,还是这些,呃,这个这个字符集的一些这个情况创建时间啊,就是里边有一些信息呢,跟我们上边那块查看的时候是一样的是吧?OK啊。但是这块呢,是具体指明某一个触发器了,如果呢,你在这个项目当中的触发器特别多的话呢,那是不是建议呢,你还是找其中的某一个是这意思吧。嗯,好的,然后这是一个点,然后呢,我们还可以呢,有第三种方式。啊,基本上大家也能够想到这个第三种方式是什么了,咱们在前边呢,查看一些其他的数据库对象的时候也是如此,从这个叫information stemmer里边呢,我们去查看啊,这个triggers这个表里边去查看这个信息啊,CTRLC。哎,弹过来。好,那具体这个操作的话呢,就直接是它了啊,CTRLC一下。
05:03
诶粘过来,那这呢是我们查看咱们所有的这个触发器,所以呢,大家你会发现呢,它列举出来的这个就会多一些啊像这儿呢,诶你看好多的哈,我有不同的数据库下呢,是不是都创建过呀,哎,所以你看它这都给我们去做了个罗列啊,然后具体的你想看它的一个什么情况呢,下边这都有。啊,下边这都有啊行,我这呢就不直接去说这个事儿了,大家呢,根据实际需要呢,去选择具体的这个查看方式就OK了啊这是一个,然后第三个点的话呢,我们来说一下如何去删除这个触发器。哎,这个呢就非常简单,甚至我们都不用看课件了,咱们所有的删除的套路呢,都是一样子的,对吧,那我们需要去照一下,这个叫trigger。啊,你想删谁呢,你看这个谁不需要了,你就删谁,因为呢,你看我们这个触发器啊,咱们前面说到过。咱们这个触发器它的执行不是像存储过程,咱们去显示的写个call这个函数呢,我们写一个select,不是的,那相当于是咱们用户主动的去调它才行,对吧?我们触发器呢,它是一个,诶基于事件发生以后呢,它的自动的一个执行,它是很隐蔽的,有的时候呢,我们确实不需要了,那你就及时的去把它删除,不像说呢,我们有些存储过程呢,你比如说你不需要了,不需要我们就放在这儿也没关系,就除了占点这个空间之外呢,嗯,你要是不调它,它也相当于是呃不去执行,对吧?但触发器不是这样子的,触发器的话呢,你要不想让它执行的话呢,那你真的是得给它删掉,因为它会自动的在你发生它对应的那些行为的时候呢,它会做一个触发的是吧。
06:30
哎,这你一定要注意啊。好,那这里边儿我们去照一下这个trigger,比如我们叫这个after,咱们给它干掉吧。嗯,After叫insert,嗯,这个test。这个名字你得写对啊,这个trigger。那你这块呢,也可以写叫drop trigger,这个我们写个叫叫if是不是叫ex,哎,Exists是吧,如果你要存在的话呢,我们就把它删掉了,那这时候我们选择执行。那如果说要是存在的话呢,这就执行成功了,如果你要不存在的话呢,我们去执行呢,它其实也不会报错的。
07:04
是吧,哎,就这个意思,好,那这块呢,我们F5呢,去做个刷新看它就没有了,那如果没有以后的话呢,我们要是再去,哎,像原来呢,你出现的那个时候的场景啊,咱们不是把这个哥们呢给它删了是吧?哎,那删了以后呢,如果我们往这个对应的这个表里边儿,咱们再去加入一条记录啊,咱们选中了做一个执行。然后呢,我们去查询你这个表里边呢,肯定是多了一条记录了,那这个叫Jerry ARM嘛,然后再查看这里边的时候呢,他就不会呢,下边是不是有那个after的一个行为了,那因为你把这个after的这个呃,Trigger呢已经给干掉了啊,是这意思,嗯,好,这个呢,就是我们说的这样一个叫删除的行为啊,非常简单啊。然后呢,关于这个触发器的话呢,我们给大家介绍的内容啊,基本上就算是结束了,最后呢,我们看一看它的一个优缺点,相当于是一个小总结了,那首先的话呢,我们看一看这个触发器的一个优点。第一个呢,就提到了它可以确保数据的一个完整性,那其实这也可以是一个首尾呼应的,咱们一开始讲触发器的时候呢,我就是通过一个叫保证这个数物数据的一个完整性呢,来给大家去举例子的,那现在呢,大家你再来看,我们现在呢,想往这个商品信息表里边添加一条记录的同时呢,把这条信息呢,是不是也添加到这个里边,那你此时呢,就针对这个表呢,是不是在insert,那你可以是after是吧?Insert之后呢,把你当前这个new的这条记录呢,相应的字段呢,是不是添加到这个里边就可以了,那就造一个这样的触发器。
08:23
那这块呢,我举的是另外的一组这个情况也OK啊,比如呢,叫进货的单头表里边儿呢,有很多的这个关于进货的这个相关的信息,然后进货单的一个明细表,那记录一些更详细的一些进货的一些这个信息啊,进货价格呀,进货数量啊,诶等等这样的情况。那么我们这个进货单那个明细表里边呢,哎,它有很多这个进货的一些情况了,它需要呢,在最后呢,去统计一下我们相应的这些商品的这个,比如说数量总数啊,金额总数啊,它是跟我们这个表中的这些这个进货单的这个明细呢,是有相关性的,那我们要保证这两张表呢,它的数据的一个完整性是吧,这个要去注意。
09:02
你看这个时候我们写的说这个,每当我们这个录入删除或者修改一个叫进货单明细表啊,这时候呢,进货单明细表里边数据呢,就会发生变动了,这个时候呢,在进货这个单头表里边儿啊,进货单头表里边儿,就它里边这个总计数量和总计金额呢,就必须得重新去计算了。啊,要不呢就不一致了是吧?诶这就这个问题,那怎么办呢?我们就规定呢,每当你往这个进货单明细表里边去插入修改或删除操作的时候呢,自动的去触发我们下边两步操作,第一个呢,就要重新计算一下进货单明细表里边这个数量的合计和金额的合计,然后呢,用第一步计算出这个数据呢,去更新一下我们进货单的这个。这个投表里边的这个合计的数量和合计的金额相当于呢,这块呢,去做一个更新啊,保证这个数据的一个一致性。这个就是我们说的触发器的一个良好的优点,说第二个问题呢,就是我们可以来触发器呢,可以帮助我们呢,去记录一下操作的一个日志,你像咱们刚才举的那个例子的一和那个举例子二啊,它其实就算是了是吧。
10:03
比如说呢,这个用户呢,会员呢,他去储值了,这个储值的这个信息呢,你储存到他这个本身的这个,我们说呃,在不同的这个一些会员的这种店里边,用户呢,储值的信息的话呢,呃,他都会有一个储值这个表啊说这个会员他的基本信息,他这个账账户的余额是多少这块都有显示,当他呢去储值的时候呢,你把它储值的就是会更新我们这个数据嘛,把它储值的这个信息的话呢,我们给它保存在一个相当一个日志文件当中了。啊,一个日志文件当中的啊,当用户呢,想查看一下他什么时候出货值出了多少的时候呢,你去查看这张表不就行了吗?诶那其实我们就只是在操作这张表,但是呢,我们通过一个触发器的方式呢,触发对这个表中数据的一个写入啊就这样子的。回头你再找这个问题的时候呢,定位原因的时候呢,就比较清楚了嘛,直接看日志就可以了,下一个呢叫触发器,还可以在操作数据前,对数据呢进行合法性的一个检验,这个其实就针对于我刚才举例子的第三个啊,你看我举的这个例子呢,都不是白举例子啊,哎,这个你看这几个呢,我们其实都有所体现了。
11:03
像我们刚才这个举例三的话呢,咱们甲克工资要求说你添加这个员工的时候,这个员工的工资呢,他不能比他这个领导的工资高,哎,咱们这块呢,不就是做了这样一个添加钱的一个检验嘛,这个完全是我们自己定义的这样的一个行为,对吧?哎,自己定义的一个行为。那这块呢也是一样,比如说呢,超市在进货的时候呢,需要呢,这个库管呢,去录入这个进货的价格。但是的话呢,这个人为的操作呢,很容易呢,就会出错了,比如说在录入这个呃,进货单进货的这个数量的时候呢,这个把条形码给扫进去了,那条形码特别长,一串这个数值,那相当于你这个数量呢,显示的还特别多是吧。在你录入这个金额的时候呢,那个看错行了。这个录入的这个金额呢,远超售价,你觉得这个售价呢,标的是100,结果呢,你这个呢,录入金额呢,写了个1000,那完了,那你卖的越多是不是亏得越严重。那因为呢,这个一减这个这不就负900吗。对吧,哎,越整越越卖得多,亏得越严重,然后卖了多少呢?这个录入的数量还还写错了啊,这个条形码数据那数量还超级多。
12:03
哎,就就出问题了是吧,像这种事儿的话呢,大家是不是也不是没见过,呃,时不时的啊,当然咱也不知道是商家是不是故意营销还是怎么着啊,爆出一条新闻说这个,呃,以前我记得出现过是魅族手机还是哪个,然后在那个京东上还是在这个,哎,是京东上啊,这个手机标的价是这个小数点位错了啊,一一千多2000多的手机呢,标成一两百了啊结果导致呢,瞬间呢,就是大家都挤过来把这个手机呢都买空了。啊,你像这时候如果录入数量还给写错了,那你这个真是就血亏了啊,那最后呢,商家也说说这既然我标错了,是我自己的问题,那我该卖多少钱,哎,该一两百,我还一百一两百的去卖是吧。诶当然这个呢,可能是营销,但是不管是不是营销,你肯定是亏钱了,像这种事儿的话呢,我们应该在录入的时候呢,就要避免它出现,对吧,咱们可以在录入之前呢,就可以通过触发器呢,去检验一下你这个数据呢是不是有问题。啊,然后你要有问题的话呢,他就禁止你去录入系统啊,这就解决了这个问题,这就是触发器的一个好处啊。
13:04
那么接下来的话呢,我们看一看这个所谓的缺点是什么,第一个呢,它最大的一个问题呢,就是可读性呢,是比较差的。那为什么这么讲呢?呃,大家你会发现呢,就是咱们创建好这个触发器之后呢,他可能就隐藏起来了啊,你就一打开这块可能几十个啊,那咱们具体看,比如你也看不出来他这块呢,具体是什么样的一个行为了,那我们呢,再往某一个表里边去添加数据的时候,一添加,诶报错了。啊,很神奇,报错了啊,你举个例子啊,我给大家举个例子啊,这个我我就说一下这个,因为我们这个trigger已经建立起来了,我要去演示这个错误的话呢,还得重新的再去,呃,创建这个这个这个触发器啊,我就不去操作了,大家你可以按照我说的这个点呢去操作一下,比如说。比如说这个吧,我们创建了一个这样的触发器,嗯,这个只要你往这个表里边儿去添加数据的时候呢,在这个之前,我们会往另外一个表里边去添加一条记录,是这意思吧,好,那我们创建这个触发器的时候呢,比如说这个位置,我写的这个字符串呢,特别长,比如说我写了这个40个字符。
14:05
啊,40个零个字符。OK的是吧,好,那这个触发器你在创建的时候呢,它是没问题的,因为你创建的时候呢,它又不会触发它的执行啊。那不会触发执行,它就诶没问题,因为他也没执行没执行对吧?好的,那么当我们往这个表里边去添加记录的时候,我添加一条记录呢,它是不是就会触发这个触发器的执行了,这个触发器执行的话呢,它就会往这个表里边去添加这个字符串了,这个在添加的时候呢,我们有一个上限,是不是30个字符,我这块呢,一添加来了个40个字符,是不是就会报错呀。然后呢,大家你会看到一个错误啊。明明我这块呢,是往这个表里边儿去添加记录,但是这块会报个错误,说呢,你这个呃T_log呢。啊,你写的过长了啊,说太长了啊,涂了是吧。那怎么写?码啊,说你这个太长了啊,哎,为什么太长了呢,有的同学就摸不着头脑了,我明明这个表里边叫tno的,怎么来个T_log呢,其实就是因为你这里边有个触发器,这个触发器呢,往这个表里边添加的时候,它叫t log,诶字符串太长了,所以说呢,就是我们这个触发器的啊,触发器的话呢,它特别隐蔽,这个隐蔽性呢,就导致它的一个可读性呢,就会比较差,它不是我们这个应用层的一个控制导致的话呢,我们很多这个操作呢,就莫名其妙的啊,比如说这块我就举了例子,咱们给这个会员呢,去储值的时候,我现在要更新这里边,呃,然后呢,把这个用户的这个,哎,这个。
15:29
字段呢,给大家做个更新,结果呢,莫名其妙的报了另外一个,说这个列呢,说在这里边儿呢,是没有的。那你说我我这个表里边根本就没有这个A这样的一个列呢,甚至说呢,你自己还往这个表里边呢,试图呢去加个A的字段,那这就麻烦了,实际上是因为你后背后呢,有一个触发器呢,它在触发执行是吧。啊,这个就哎,导致这个可读性比较差导致的啊下面一个呢,就是。相关数据的更新呢,可能会导致这个触发器的出错,你比如说我们作用在这个我们触发器呢,它会,呃,可能会对应的其他表的一些这个这个这个写入的一些行为是吧,那如果说我们原来这张表的这个表结构呢,做了一个更改啊,表结构做更改了,然后触发器呢,我们还没有改,那么有可能我们再去执行的时候,这个触发器呢,它就报错了,哎触发器报错的话呢,这块整个相当于也就出问题了。
16:16
你还得去排查是吧啊,因为它可能性又比较差,还很难找啊,就是这样的问题啊,这个有利有弊嘛,任何事物出现其实都是有利有弊的啊。好了,那么关于这个触发器这个优点缺点说完了,最后这是一个补充点,大家呢,可能会有这样的一个疑虑啊,有同学想到了,有的没想到啊,我呢就提前跟你说到了,这个是什么意思呢?啊,我下边还写了个举例啊,我给大家一说就明白了。这个是员工表,这个是部门表,咱们已经很熟了啊,Employees是吧,这个叫departments,这两个表咱们呢,讲了这个外径约束以后呢,咱们这个员工表里边有一个叫department。填写了啊,他们的ID就是部门的一个ID,然后呢,让这个字段呢,呃,这个列的是不是关联到我们这个部门表里边这个组件了,是吧,这有一个外径约束。
17:01
啊,有外约束,咱们在创建这个外键的时候呢,是可以去指定咱们说的叫on update或者on delete cascat,或者叫sign no,这个还记得吧。比如说我们叫这个,呃,On update叫CA吧,就是跟着呢做这样一个修改或者赛道啊都行啊,呃,我们这个呢,比如说是员工的是十号部门的,我们这呢,就对应的有这个十号部门,当我们把这个主表或者叫副表当中这个十号部门呢,比如说我们给他删了的时候。啊,删了的时候,那我们比如说用的是叫on,比如我用on delete set now吧,哎,这样的一个外径约束在创建的时候,那就意味着当我们把主表里边这条记录删除的时候呢,我们这个从表当中如果有这个十号部门的话呢,是不是把你这个位置呢,就给它制成一个闹了呀。哎,是不是就把我们这从表这块就支整个闹了,因为这块行为是他。啊,咱们当初呢,应该咱们讲外径约束呢,给大家去举过一个例子来演示的啊,今天就感受到了,好,那现在的问题就是说,如果我们针对这个从表的话呢,咱们有一个触发器。
18:02
啊,我有这个trigger,这个trigger呢,呃,也是针对于你这里边儿的一个啊,咱们这相当于把它改成个闹了,比如说是一个修改行为。啊说如果你要是修改这个表中的这个记录的话呢,哎,这个update的话呢,我们就会触发这个触发器啊,是这样的一个触发器作用在它上边,哎,那我们还真是跟这个没关系的啊,我们举个例子,比如说你这块呢,去更新这个表中的这个字段了,一更新,然后这个触发器呢就触发了,这是没问题的,但是如果呢,你是基于这种外键约束的场景造成的,呃,由于我们这个主表中这个这个删除了,导致这块呢做了一个更新,此时的话呢,这个触发器呢是不会触发的。那这个你要注意一下,它是不会触罚的啊,哎,我想说的呢,其实就这两个点啊,大家知道这个事呢就可以了,那这块写的不会被激活啊好,那么整体呢,关于触发剂的知识点呢,咱们就到这儿。好同学们,这个触发器啊,咱们就哎知识点呢就说完了,哎,整体上大家来看呢,实际上是比较简单的是吧,哎,比较简单的啊,所以这块呢,我们给大家举的例子呢,就也没有那么多了啊,主要错了三个啊,三个对应的也就是我们这里边涉及到这个优点的点,那缺点的点呢,大家也关注一下,那接下来的话呢,我们看一看这个客户的这个练习题啊,找到我们这个触发器,然后这块的话呢,我是给大家呢,就设计了两个这个练题啊,这两个练习呢,在我们实际应用当中呢,大家也可以考虑呢去使用的啊OK。
19:21
好,那这块我们就看一看这两个题目啊,我们再去新建一个这个文件啊。好,先把这个文件呢,我们保存一下。哎,在这CTRLC一下。CTRLV触发器的这个课后练习。好到这啊,CTRLCCTRLSCTRLV啊,我们做一个保存。首先呢,我们来看一下这个角下练习一啊。好保存一下。这块的话呢,我们直接把这个需求呢,咱们就粘过来就行啊CTRLC。好,没有问题,这块的话呢,我们需要呢,去创建一个表是吧?嗯,这个是咱们这个课后练习题,那我们不妨呢,也去新创建一个数据库吧,哎,这也算是个准备工作,然后就在这儿。
20:04
嗯,Create。这个我们来一个叫嗯,Database。这个我们叫test。嗯,17啊下划线。Tri啊,就跟我们前面这块呢,这个思路是一样的是吧,好,那这块我们选中了做个执行。好,可以啦,然后去use一下我们当前的这个数据库。哎,又是。来走齐好,那么在我们这个数据库下呢,我们现在开,现在呢是创建这个表,这个表呢,还是从咱们这个叫艾特硅谷DB这个数据库下呢,我们这个叫employees这个表这块呢,我就轻量级一些了,咱就取了三个字段,那三个字段就可以了,来周琦。没有问题,好,那么这个创建完以后呢,我们首先呢,去select形from一下我们这个EMS。哎,选中执行只有三个字段,一共呢107条记录没有问题的,好,下边说呢,我们就要复制一张emps这个表,复制一张emps这个表的一个空表,那只有表结构,不包含任何数据啊,这是对于空表的一个进一步的刻画,那这个呢,大家应该都会实现啊,我们就create一个table叫EPS,然后BA这个叫backup啊,属于呢就是备份的一个意思了,然后as是不是叫select?
21:18
啊星嗯,咱们星就行了,哎from一下,我们叫ES,这个呢,应该是比较简单的,哎,错了空表是吧,那还得加一个where啊,这个我们当时说过是不是就E等于二就行了。因为这个始终呢,相当于返回是零,是一个false的,所以我们就不会有数据了,来走起。嗯,OK了,然后查看一下我们这个表中的数据,确保呢你是没有东西的。嗯,来个星from emps的,然后back是。啊CTR,哎,这个这个直接执行啊,没有啊没有问题,好下面我们再去创建一个触发器,这呢,就我们这个触发器它的一个作用。说呢创建一个触发器,那我们这块就来吧,这没事。
22:05
哎,在这我们去create啊,终于不用create procedure或者function了啊create呢什么呀,叫trigger。嗯,这个名字呢,写好了拿过来CTRLC,诶这样子。然后呢,说每当像这个EPS这个表里边,我们去添加一条记录时呢,同步呢,将这条记录呢,添加到我们这个,诶备份的这个表当中啊,很清楚很清楚,好,那这块我们就可以呢是诶没有提before和after,那相当于就是我们就用这个after了,在我们添加之后,你先往这个。呃,EPS这个表里边儿去添加。那这个表中添加完以后呢,把你添加的这条记录呢,我们再添加到这个表里边。就是这个意思,好,那我就after是不是叫insert,然后on一下EMS是吧,然后叫for each肉没问题,然后下边是不是就begin了,然后N的结束对吧?好在这呢,我们去写。
23:00
干什么事呢?我们说呢,将。这个将啊这个锌添加到。这个EPS这个表中的记录。然后呢,添加到。咱们的EMS这个叫哎,Back这个表中啊非常明确好insert into啊这个我们叫back是吧,它这里边这个里边的话呢,涉及到这个字段,这个字段呢,大家也可以呢,去给大家写一下也行,主要呢,是不是就这三个字段CTRLCL一下。来CTRLV好,然后values,那这块呢,我们新添加的这条记录呢,怎么表示呢,咱们这会儿也提到了,是不是这个new啊,那就是new.employee ID,然后呢,诶new点。Last name。哎,new.salary这就是我们新要添加的这条记录呢,我们就是个new OK。没问题吧,那这个执行完以后呢,就完事了,好,那我们这块呢,选中来做一个执行。可以了,嗯嗯,这块你看不看都行,你要看的话,你可以在这块我们去搜一下叫。
24:03
Triggers啊,咱们用分号来结束吧,好来这块我们选中的执行这块,你看我们刚才创建的这个是不是就有了。哎,没有问题啊,那这个就来注释一下了,那下边呢,我们去验证一下这个触发器呢,它是不是起作用了,嗯,这个是OK的,嗯,咱们把这个查询语句呢,咱们也提前的都拿过来啊,在这块我再写一个是EPS的。这么着的,首先呢,查询我们这个表里边儿呢,咱们有这个107条记录的,现在呢,我们要往呃这个表里边呢,去插入一条记录,插入的时候呢,希望你把这条记录是不是再插入到我们这个表里边呀,好的insert。啊,Into一下EPS这个字段呢,你愿意写上你就写上。是不是这三个字段CTRLC。呃,Y64好,这块呢,我们写这个,嗯,你跟这块呢,就避开吧。这个是到206了,那我们写个还是写300吧。这个叫汤姆。
25:01
工资呢,比如3400。行来我们选中。这行可以了,接下来的话呢,我们从这个备份的这个表里边,我们去查看一下,走起大家你看是不是我们这个数据就过来了。没问题,那我们这块再来个301,他一这个,哎三千六来我们再执行。啊,这块我们再查询这个是不是也有啊,好,这个我们就说清楚了,那相当于呢,我们这个触发剂呢,就是起作用了,那么我们这样的一个行为呢,就会使得每当我们往这个表中添加记录的时候呢,这个表里边儿都会做一个记录,那你可以呢,比如说指定包括你还可以去记录时间嘛,哎,什么时间呢,我们往这个表里边做过什么样的一个添加操作,我们直接看这个备份表呢就清楚了。那就是这样的一个行为,这呢是咱们这个练习一,大家在这个实际生产环境当中呢,可以去考虑使用,OK,然后呢,我们来看一下这个练习二。CCTRLC一下。好,这一下准备工作呢,这里边我们仍然用的是上边的EMS这个表,OK了,再者呢,我们去创复制一张这个emps这个表啊,是一个新的啊表一个一,这个表结构呢,不包含任何数据,咱们上边这个呢,是体现这个添加行为的,我们这个呢,是体现这个叫删除行为的啊看看什么意思。
26:13
啊,这块这个操作呢,大家都比较简单啊,是咱们前面都已经讲过的create table ES,然后呢叫BACK1,然后as select行from一下我们当前的这个EPS这个表一定要记得咱们去Y一下,一等于二是吧,保证我们这个emps这个表里边呢是没有数据的。来,我们走起。可以了,然后查看一下你这个表中确实是没有数据的,Select清from一下。没问题来选中。执行啊,没有数据好的这块呢,我们要创建一个这个触发器了,这个触发器呢,就是说每当你像这个em emps这个表里边儿去删除一条记录的时候呢,我们同步的将你删除的这条记录呢,添加到我们这个备份的这个表里边,这是针对于删除的一个行为。
27:03
好的,来咱们看一下,那我们呢,就可以去create啊一个trigger。那这块呢,其实创建它之前呢,你还得记得也得加上啊,这个等一下加也行。那名字呢,就是他。哎,CTRLC啊这么着对吧,这块我们是要删除,针对于这个删除的。啊,咱们这个EMS是吧。那这块呢,就是我们是在之前还是之后啊,咱们其实可以到考虑呢,就是在这个之前。就是你删除之前,你把这个数据先备份过去啊这个意思,所以要before delete on我们这个表,然后呢,For。Each肉对吧,然后下边我们就写这个begin,写这个end了,那一写begin的话呢,我们上面呢,就把这个上是不是给它加上啊。哎,这样。N的这块呢,记得给他补上。哎,这么着好的,然后这块我们去写,那咱们要干什么事呢?就刚才提到了,哎,咱们将。
28:02
那将这个EMS这个表中。是不是删除的这个记录呢,这个添加到这个我们这个百一这个表中啊。就这样的行为好,所以这呢还是个inser的行为,Inser into啊ins呢是哎BACK1,然后这个字段的话呢,咱们也可以写上还是这几个字段。CTRLC。这样是吧,哎,然后value行,那这块呢,你注意咱们是一个删除行为呢,是表中已经有了,所以这块呢,就不能用这个new了啊,咱用的是这个old啊,就是你要删的这条表中已经存在的这个记录啊,叫old了。这个old的employee ID。Old的。哎,Lastname。哎,还有它的这个salary。没问题是吧,哎,我们就添加过来了,行,然后呢,最后就结束来,我们选中呢,做一个执行。好,成功了,成功以后的话呢,诶,我们去验证一下是否起作用了,首先呢,咱们去。
29:06
那select星from一下咱们当前这个表。选中。尤其这块呢,你看有109条这个记录啊,咱们刚才那会儿也查看过,这个表里边是没数据的,咱们把它呢也拿过来。好,拿过来了,行,那首先的话呢,我们去做一个删除delete from ES,然后呢叫where,比如说我们想删除一下这个employee ID,等于比如咱来个101吧。我想把这条记录呢给他删了,现在有109条,好,我们选中呢。走起删了,删完以后呢,我们再去查看,就变成108条了,看101就没有了,关键呢,就是我们看这个表里边是不是有刚才那条记录,走起,诶大家你看是不是就有了。没问题,有。啊有好,这是一个情况,咱们再再来一个,有同学说你这就只有删一条,那我们能不能批量删啊,批量删的话呢,夸张一点,咱们就直接呢,是不是就这么着啊,我把这个表中的记录呢,全部都删掉。
30:01
来,你看一下,走起。是不是都删了,然后我们查看一下这个EPS这个表里边是不是就没有了,那你没有了,然后我们这个表里边呢,来我们执行一下,诶大家你看这个呢,是咱们刚才删的这个第一条记录,下边这块呢,是不是你删除我们这个EPS表里边剩下的所有的记录啊,那这个记录你看所有的是不是都添加到我们这个,哎,这个这个备份的这个表里边了。啊,那么这块呢,这个作用呢,是显而易见的啊,它能这个触发器能做什么用呢?来你想想有的时候呢,我们会对这个表呢,诶咱们说这个默认的delete from呢,它相当于也是一个自动提交的,那你要是没有提前呢,去设置说set auto commit,等于这个相当于不让他提交的话呢,这个删除以后呢,这个数据就没有了,那你要是有这种触发器的存在的话呢,相当于我们在每一次删除的时候呢,都做了一个备份。那这个数据呢,其实都还在是吧,诶你直接呢,从这里边呢,再把这个备份的数据呢,再去做一个,诶这个重新呢,再写回到我们这个表里边儿呢就可以了。就可以了,那刚才这个呢,我们批量的一个操作为什么也能起作用呢?就是因为我们这里边儿呢,针对于你每一行的这个删除行为呢,它都会去起作用的啊一尺肉嘛,所以呢,就是我们你这块删一条,我这块呢就隐射一条,删了多少条,这块就隐塞了多少条啊是没有问题的。
31:14
好,那么大家看的也比较清楚了,那关于触发器呢,因为整体也比较简单,所以这个课后题这块呢,我就给大家呢,就涉及到这两道啊,应该说从应用的角度来讲呢,还是比较实用的啊,大家呢自己呢也去写一写,那关于触发器呢,咱们就告一段落。
我来说两句