00:00
好的,那咱们这个第16章这个课后练习呢,咱们做完之后啊,咱们关于15章16章的内容啊,就彻底讲完了,那其实这两章呢,咱们可以算合在一起啊,整体呢,就是关于存储过程和函数的,对吧?那我们这个变量啊,流程控制啊和游标呢,也是在咱们存储过程和函数当中呢去使用的,对吧?那在实际的生产环境当中呢,大家可以根据这个公司的需要,咱们去定义这个存储过程或函数就行了。哎,咱们在讲这一章的时候呢,提到过,说它是存在争议性的,对吧,然后呢,诶主张使用的呢,肯定是看到它的优点了,那不主张使用的呢?呃,看到的就是它的这个缺点,大家呢,根据实际企业的这个需要呢,你去决定就行,但是整体上来说的话呢,呃,存储过程跟函数呢,是咱们整个讲my circleq也好,或者circleq也好,算是比较重要的一块内容,那这个大家呢,去关注一下。好了,那么这两张比较重的内容啊,这个我说的重的话呢,就是东西稍微多一些啊,之后呢,咱们来看一下这个第17章叫做触发器。这一张的话呢,虽然我们单独的给大家拿成一张了,但是这一章的内容量的话呢,其实没有那么多啊,你也可以看成是一个叫麻雀虽小,五脏俱全,咱们也会涉及到它的一个创建,查看,删除优缺点啊,跟咱们前面讲这个存储过程和函数啊是类似的,就是几部分呢都有包括呢,它也是咱们讲的一个独立的,是不是一个数据库对象呀。
01:19
像我说的视视图啊,存储过程函数啊,触发器啊,表啊是吧,这都是属于数据库对象,那只不过呢,这个结构呢,相对来说比较简单而已。啊,就这样子的行,那这块呢,咱们看一看这个触发器啊,这个名字上你看起的就很特别,嗯,OK,咱们看看它是做什么用的。首先呢,我这块呢,放了一个实际当中生产当中的咱们的一个案例啊,这个案例的话呢,相当于就在解释咱们什么场景下呢,会使用这样一个触发器的结构,OK,你看我这块有一个实际的场景。那咱们这个昨天的话呢,也是这个双11是吧,诶大家不知道有没有剁手啊,诶这里边呢,我们针对比如说这个电商的项目,咱这块呢,就涉及到有两张表,那一个呢叫做商品信息表,一个呢叫做库存信息表。
02:03
那当我们往这个111个新的这个商品记录呢,来的时候呢,我们就需要呢,把这个商品的记录的信息啊,放到这个商品信息表里边儿,同时的话呢,我们还需要呢,去更新一下这个库存信息。诶,大家你注意我刚才说的话了没有,我说叫同时是吧,言外之意呢,就是我们这个来了一条新的这个商品之后呢,我们同时需要呢,更新两个表中的这个记录,先更新它,再更新它,那么这两个都更新了,我们可以理解成了就是保证了这个数据的一个完整性,你不能说这个商品信息在这个表里有了,然后库存里边一查没有,那就不对了,是吧,那就相当于这个数据呢是不完整的。OK,那我们怎么样去实现这样一个需求呢?就是说哎,往这里边添加的同时呢,我们接着再往这里边去添加,哎这里边呢,大家能看到,其实可以理解成是不是两个update的这个操作呀。这两个update操作呢,我们从下边的这个内容上来讲呢,咱们可以使用一个事物呢,去进行包裹,在这一个事物里边呢,我们让它包含这样两个update的操作,确保呢,这两个操作呢,就是要么呢全部执行,要么呢全要不全部啊,我说的是这个不啊,要么呢全部执行,要么呢全部不执行。
03:08
那我们把这个呢,就称为呢,将事物的一个叫原子性。那到下边的时候,我们会讲到这个事物里边叫acid这个属性,那其中这个A呢,就指的是原子的意思。那原子怎么理解啊,就是咱们理解成物理世界当中最小的这个单位的话呢,就是原子了,你就在别研究里边这个有这那的是吧,咱就说最小的物理单位咱就当原子了,那原子性指的什么呢?就是你这个东西不能再细分了,就要么呢你你就拿走这一个原子,要么呢你就不要别别拿走你别这块的原子,你说切一半啊,那不可能,诶这呢就理解为呢,就是我们事物里边这个操作呢,就要么都执行,要么都不执行,所以呢,咱们针对这两个update操作呢,你可以用事物呢去体现,那这是OK的。那这是OK的,但是在一些特殊的情况下呢,可能还得需要呢,我们这个用一些手动的方式呢,去做一些维护,那或者说呢,你换个角度说,我们要是不用这个事物呢,去体现,我们怎么去保证它这个数据的一个完整性啊。
04:06
啊,这个同学提到说我们手动去维护是吧,手动维护呢,那就意味着我们在往这个表里边儿添加一条商品记录的时候呢,一定要记着呢,是不是去更新我们这个表里的数据啊。那这块我说的是一定要记得更新,但你要是一不小心忘了呢,那是不是就导致我们这个数据就缺失了完整性了,就得不到保障了。理解吧,那就是这样一个场景,好,那我们面对这样的一个场景怎么去解决呢?除了事物呢,我们说还可以呢,去考虑触发器,咱们呢可以去创建一个触发器。触发器是吧,让这个商品信息的数据呢,在插入操作呢,执行以后,咱们自动的去触发往这个库存信息表里边呢,去插入的这样一个操作。你看这个触发器呢,作用在哪呢?就是我们针对于这个表它的一个insert一个行为啊,我这写了一个是叫insert了是吧,就是你一旦往这个表里边呢,去INSERT1条记录的话呢,我们就自动的会去触发你这个表里边的一个insert的一个行为。
05:05
OK吧,哎,那么这个时候的话呢,我们就用个触发器呢,就可以保证这个数据的一个完整性。那我刚才这块说的update update是一个泛泛的一个更新哈,那具体来讲,在我们这里边其实就是隐私这个行为了。那这呢,就是我们说的触发器,它的一个,呃,这个一个具体的应用场景啊,那么这个场景呢,我们是为了保证数据的完整性,对吧,那最后呢,咱们也会谈到它的优点,那其中一个主要的优点呢,就是保证这个数据的一个完整性。哎,这个大家关注一下。啊关注一下好,那下边呢,咱们来看一看关于这个数发题他的一个介绍,诶这个呢,是从麦SQ5.0开始呢,就开始支持了5.0,然后咱们后边的5.5 5.65.7,然后8.0啊其实呢,历史已经比较久远了。啊,这是一个啊,另外一个的话呢,这个触发器呢,跟咱们说的这个存储过程一样啊,它都是嵌入在这个MYSQL服务器当中的,诶属于服务器当中的一般的一个代码,你直接呢,就是通过我们这个SQL指令去调一下,诶错了。啊,SQ指令的话呢,我们去调的话呢,调这个存储过程是吧,触发器的话,你注意哎,咱们不是咱自己去调的。
06:06
啊,那那怎么它是怎么执行的呢?你看触发器呢,它是由这个事件呢来去触发的。由事件出发的这个事件呢,指什么呀,就是我们哎常写的这个增删改啊,这些行为呢,我们就称为呢,叫哎增删改的事件。当这个增删改的事件呢,发生的时候呢,我们就会自动的去触发这个触发器的一个执行。所以你看触发器,触发器就是呃,就是触发它的执行,那它里边呢,会包含一些这个逻辑啊,就是类似于我们说存储过程begin和N里边呢,那个函数体啊,或者存储过程体里边那个代码一样啊,只要呢,你这个事件呢,这个触发了。呃,只要你这个事件发生了,这个事件呢,是咱们自己,比如说你想添加一条机录是吧,我们自己呢去主动的,呃,一旦呢,你这个主动的去做一个隐私操作呢,诶如果你这个触发器呢,是绑定在这个隐私上的,我们这个触发器呢,就会自动的去执行。
07:01
诶自动的去执行啊,大家去体会一下。啊,这里边儿呢,我们又引入了一个词叫做事件,这个所谓的事件呢,就是指用户的动作或者是触发某项的行为,这个呢我们叫做这个事件。这个事件的话呢,其实呃,咱们也是首次引入这个词哈,在这个呃,这个移动端的话呢,大家可能更容易理解啊,因为大家呢,天天得用手机对吧?好,那比如说我们举一个场景啊,这个手机的话呢,哎,这块呢,比如说你登录一个网站啊,登录一个网页,然后这里边呢,需要呢,我们去填一些你的这个信息,填完以后的话呢,它最后会有一个比如叫登录啊,还是要注册呀,还或者叫提交啊,当你一点这个按钮的时候呢,它就会呃弹出另外一个界面啊,说这个登录成功,或者叫注册成功了,或者那叫失败了。那这个时候呢,其实它是,呃,把你当你点击这个按钮的时候呢,它相当于把你整个前台数据呢,是不是发送给这个服务器了,那服务器这块呢,诶如果呢,是这个记录成功以后呢,它返回给你一个说登录成功,或者叫注册成功,或者叫提交成功这样的一个信息的,对吧?中间呢,我们有这样一个过程,那么这个过程是怎么发生的呢?是不是就是因为你点一下这个按钮啊。
08:06
那我们把点这个按钮的这个事儿呢,咱们就称为是一个叫做点击事件。咱就成为是一个点击事件,那我们能看到的事儿就是当你点一下这按钮的时候呢,他把你这些信息呢,是不是信息呢,是不是发送给我们服务器了,这个里边呢,是不是肯定会蕴含这个代码呀。对吧,诶就是获取你这些数据,然后呢,给他发出去,那涉及到一些代码,那就意味着呢,当我们这个当你去触发啊用户呢,触发这个点击事件的时候呢,这个点击事件呢,它其实绑定了一个监听器,在那个监听器的一个方法里边呢,就写了这些代码了。啊,这块我们叫一个叫什么叫监听器了啊。啊,叫监听器了,就是你这个点击事件一发生,这个监听器呢,它就开始执行里边有个方法,那个方法的话呢,就开始,哎,或者叫函数是吧,哎开始执行那个函数里边这个代码就去工作了,哎,那么这是点击的,那有的时候呢,比如我们看一个图片,这个图片呢,你看这个页面上,它也没有任何按钮,当你去长按的时候。
09:02
长按的时候呢,有时候它会出现一个dial这块呢,说你是想复制啊,你还是想这个这个这个转发呀,还是想分享啊,还是想想想下载啊等等的,是不是会出现这样一个dialo,出现好几个选项,那这个时候呢,你是长按出来的,点击一下没没作用,它其实相当于对应的就是一个长按的啊,或者叫长期的一个事件。那我们在这个手机端的话,它这个事件呢是很多的,包括你这个拖动事件啊等等的是吧,还有好多的这个事件,那我们这里边儿呢,也是这个事件,只不过我们这的事件呢,叫增删改。啊,就名字呢不一样啊,具体的行为也不太一样啊,那么我们刚才讲的一些里边这个所谓的监听器,那然后呢,会调用它的一些代码,其实那个监听器呢,就类似于我们这里边儿的一个触发器。哎,就是相当于是这个触发器了。好,那这块呢,大家呃,希望我刚才一个描述呢,让你对这个事件呢,也应该有所理解啊,有所理解好,那么关于这个基本上这个背景的东西啊,咱们就说完了,下边的话呢,我们看一看这个代码层面的第一个问题呢,这就是关于触发器的一个创建。
10:02
啊,它这个创建好,那创建触发器呢,呃,整体这个套路呢,其实跟前面一样啊,你想创建什么,你就直接创建就行了啊create触发器啊,那就trigger trigger那就触发器的意思。创建一个触发器,起个名。哎,然后下边这块呢,就整体上来讲啊,这一行信息呢,是比较关键的,我们这个触发器啊,它一定是跟某一个具体的表,它是有这种深度的耦合的。或者说的话呢,咱们就是这个触发器就是作用在这个表上的,比如我们这个叫表A吧。就这个表是吧,那我们可以怎么着呢?我们创建一个触发器,起个名,然后呢,你是before还是after,你这个增删改事件呢?咱们挑一个,举个例子,我们希望这个表A当中,每当这个表当中我们去增加一条记录的时候。嗯,增加删除吧,啊,Delete是吧。哎,删除哎,我们删除一条数据的时候呢,我希望呢,它触发一个触发器的执行,所以呢,我们就可以呢,是不是这个三个事件呢,选哪个我就选那个delete on哪呢,是不是就on我们这个表A呀,哎,咱就表A了。
11:05
当你delete on这个表意的时候,哎,这个时候呢,其实比较含糊了,具体来讲是你这个delete行为之前,还是这个行为之后呢?啊,比如说我们想在你delete的之前啊之前,哎,我们去执行你这样一个触发器,所以呢,我们当删除表A中的一条记录的时候,在删它之前,我们就要触发这个触发器的执行了。啊,下边这个呢,叫for each row,就是每删除一条记录,因为删除我们可以是不是一次性的delete from,然后你where呢,写的宽泛一点,可能删除多条记录,对吧?每删一条记录呢,我们就会触发一次触发器的执行,执行什么呀,下边就是你这个执行语句。那就干这就做这个事儿,那这个意思这块呢,你可以写begin end,那里边呢,就会可以写多条这个SQL语句了,对吧,那就这样一个除罚执行。啊,这个呢,就是我们说的呃这样的一个事情,然后呢,呃,我们现在是针对于你这个表A的这个delete的行为呢,做的这个触发器,那如果说我们针对这个表A呢,我们想添加一条记录。
12:04
那这时候这个触发器会执行吗?哎,注意不会,那因为呢,我们只是针对这个delete的行为的,你要是inser的话呢,那你就去建你insert那个触发器啊,这个大家要注意一下。嗯,好的。嗯,这呢,就是我们把这个整体结构呢,先剖析了一下,然后这个触发器的这个执行语句块呢,哎,你可以呢,是一个单独的SQ语句,那如果说比较复杂的话呢,你可以放在这个begin和end当中,那就可以了。行,那这块呢,是咱们这个,呃,一个说明下边呢,咱们就看一下具体的该怎么去实现了啊,这块我们去新建一个,这是咱们的第17章。触发器对吧,好,首先呢,我们这个CTRLCCTRLSCTRLV,咱们保存一下。哎,这么着啊,那这块呢,我们先来说一下第一个问题叫,哎如何呢去创建。触发器好的啊,那刚才呢,我们已经说过它这个语法结构怎么去实现了,下边我们就具体来做这样一个行为,嗯,这里边呢,我举的,呃,一共是有三个例子啊,首先我们看这个例子一。
13:05
这个例子一的话呢,它有一个前提呢,就是我们先把这两张表呢先造出来。好造两张表,那造这个表的话呢,我们得用数据库了,这个数据库的话呢,咱就别用之前的了,咱就自己再去新建一个,所以这块呢,先是一个准备工作啊,这个放到这个上面吧。准备工作对吧,那我们就首先呢去create这个data是吧。哎,对贝,咱叫DB test17,这样吧,前面这个if not exists,这个character set u8这个我就都省略了,来,我们走起。好创建好,然后呢,我们去use一下DB test17。选中执行好这块呢,我们就切换到咱当前的这个数据库下,你看这块F5刷新一下这个就出来了,目前呢,这里边呢是没有表的,接下来的话呢,我们先去创建啊,这个在这个下边,咱们先去第一步吧。
14:02
创建数据库,哎,先创建数据表。嗯,这个呢,我们长度呢是30是吧,好的,那我们这块呢,选中,哎,走起。那我们就创建了这两张表啊,你在这块呢,F5刷新一下啊,这两张表呢,是不是就出现了是吧,没有问题的啊,然后呢,我们下边表已经创建好了,首先呢,咱们查看表数据。给我写个二吧。哎,查看这个表数据,那select。行,From一下我们这个test。这个。哎,这块呢,先走起没有啊,那你刚创建的里边肯定啥也没有嘛。这个呢叫test trigger log啊,你看这名呢,就是相当于针对上面的表的一个一个日志是吧?啊这里边你看也没有数据行,这个呢比较清楚了,然后呢,第三步的话呢,我们开始去创建一个存储,哎,这个触发器。
15:03
好,那我们创建这个触发器呢,是做什么用的呢?看一下这个需求。CTRLC。反过来。这个稍微有点长,咱能给他换一下行。OK了,看一下创建一个名为这个的触发器,向咱们这个表里边儿呢,去插入数据,之前你看这些呢,都是关键字眼儿,然后像我们这个表里边呢,去插入一个数据。啊,就是这两个作用,那这块就是保证这个数据的一个这个完整性的,好,那我们这块呢,就create。这个trigger,哎,这个名字给我们写好了,叫做before。Insert是这意思吧,呃,这块我们稍微多说一句,就是你看我们这个名字的话呢,它虽然给起好了,但是这个名字我们说起的不是特别的到位哈,为啥呢?呃,因为呢,我们写触发器的时候呢,在一个数据库下呢,有可能有很多的触发器哈。呃,那一会儿呢,我们也会讲呢,怎么去查看这个触发器,那很多触发器的话呢,你要是光看这个名的话呢,尽量呢,我们能够区分出来你操作的是哪一个触发器,针对是什么样的行为,是这意思吧,那这块光写的是before insert,那有好多都是before insert了,那这个咱们就看不出来你针对哪个表了,你可以呢,后边比如针对的是咱们这个test这个表是吧,甚至呢,你可以再加上个TRA,那一看呢就知道哦,这是个触发器的意思。
16:16
啊,Trigger的这个前三个字母嘛,啊,这样会好一点,行,那这块我就比如说给它改一下名吧。反正这个例题呢,是咱们自己定义的,那我定义的那块,我想改我就改了,对吧,你要在公司当中,你别说人家这个,哎,可能相应的这个项目经理呢,把这个那个出发器名都给你定义好了,你说觉得不爽,你自己改了,那那就不好了啊,那就不好了,因为还涉及到这个不同人员的一个交互问题,接口对接问题,OK。好,Create一个trigger他。OK了是吧,然后接下来的话呢,人家说是在before什么呀,Insert的时候啊。Before insert是不是on咱们的test?Tri这张表的时候呢,我们叫哎,For each肉是吧,那几个单词呢,都得清楚,然后再往下的话呢,就开始写我们具体的出发句的语句结构了,咱们呢,可以用这个叫呃比begin和这个end了,那既然用这个的话,里边我们可能会去写这个,这个叫什么呃分号了,那要用分号的话呢,前面是不是又得是用这个limit啊?
17:12
诶同学说呢,诶都忘了用那个deliter,当时为啥要用它了,还记得吧。哎,这个同学这光光知道写了,写着写着都不知道说为什么要这样写了。就跟有的同学呢,这个,呃,可能这个选择要创业了啊,一开始满怀这个激情啊,创着创业呢,就忘了自己为什么要创业了。啊,两个人呢,明明一开始都挺相爱的,然后呢,呃,经过一个事实现实的一个折磨啊,最后感情越来越淡啊,后来都不知道两个人为什么走到一起了啊,时不时的,其实还是要回归一下这个初心的啊。我们为什么要加这个,呃,Di limitter呢?就是因为我们在这里边写这个产语句的时候呢,诶比如我们这块写完以后有个分号,你下边呢,可能还有这个,比如insert等等,还有一个分号,那我们这个创建好以后呢,一旦我们执行的时候呢,他一见到分号呢,MYSQ就认为你结束了,那后边这个呢,它就不执行了,那怎么办呢?咱为了解决这个问题呢,所以用了这个这个符号就表示呢,我们这个呢是结束的意思,那所以说的话,我们在整个执行的时候呢,那相当于是他到这儿的时候呢,才表示我们整个呢,程序结束了,它就不认为这是一个结束的意思了,所以这就是个整体。
18:16
好,那等我们都执行完以后的话呢,咱们再恢复一下啊,这个分号呢,表示的是结束的意思啊,所以说我们一开始先改一下这个执行结束的标识标标识啊,最后呢,你再给他改回去,就是这样的意思。啊,清楚一下。好,这个我们再拉回来,那begin end,这里边我们要干什么事呢?当你要往这个表里边儿去隐私的数据之前,啊,针对于每一行数据呢,我们都需要呢,把哎,往这个表里边去插入一条信息,那这里边就是去insert into到test。Bigger,然后呢,Log是吧,哎,咱们只需要往这个表里边的这个这些字段呢去添加数据就行,因为另外一个呢,是auto increment了,是一个主键是吧,不用管它,我往这边去加数据啊,CTRLC一下。
19:02
那就这么着吧,是吧,然后values。在这里边儿呢,我们去写这个信息就行。这个呢,咱们这个简单点吧,我就写一个before。然后呢,这个insert。哎,我就这样吧。这个应该没有超过这30个字符。那切的比较短,可以了吧。好,那这样的话呢,我们就把这个,呃,相当于是触发器的,咱就创建好了来选中了,咱们执行一下。哎,可以了,然后这块呢,你也可以F5呢做个刷新,然后触发器,那这块就已经有了,没问题,好,那这块有了以后呢,下边我们相当于就是一个测试了,那我写一个这个四。这呢相当于是一个测试,测试的话呢,这个嗯,咱们那块其实已经看到了,这里边儿是没有数据的,对吧,我们呢,先去做一个insert。那into一下我们test这个trigger这个表。然后呢,我们只往其中的这个。嗯,叫这个字段里边我们去添加数据,因为这呢是一个主键了。
20:02
Value是吧?好,这个里边我们去写上,比如这个Tom。来,我们选中。执行啊可以了,那这个添加好数据以后呢,我们接下来啊,关键的时刻到来了,我们呢,诶查看一下我们这个表中的这个数据啊,走起,那是不是已经有这条数据了,然后再接下来呢,我们去查看一下咱们的这个,呃,另外的一个表啊,我们在执行好,大家你会发现呢,是不是我们这张表里边也有一条数据啊,而这个数据信息呢,是不是就是我们这个信息啊。那就相当于我们这个触发器呢,它就起作用了。哎,它就起作用了,行,那这呢就相当于是咱们的一个演示啊,我们这个触发器的一个基本使用,这个可以看成是咱们的一个。呃,创建触发器,这算是一个举例啊。哎,这叫举例一啊这样的场景,好,那接下来我们再看一下咱们课件啊这块呢,这个举例二的话呢,实际上也是用到上面这个表了啊,创建了一个新的这个触发器,哎,CTRLC一下。哎,这个举例二,好,我们看一下这个需求。
21:04
嗯。那这么着。看一下说呢,创建名为叫after insert这样一个触发器,在我们像这个还是咱们说的这个表里边插入数据之后啊,咱们向另外的一个表里边呢,去插入一条信息记录。啊,这个呢,就是时机不太一样了,好,嗯。这个trigger。对吧,然后这个呢叫after insert啊CTRLCCTRLV,那咱们还可以呢,是不是去改一下,针对这个表呢,是不是一个叫a trigger,是这意思吧,好,我们CTRLC一下,那我把这个呢也给它改一下。然后呢,它是一个叫after。After什么呀,Insert是吧,然后啊,还是我们这个表。Has。推个列表,然后放呢一尺肉好,下边呢,是不是又该begin了?然后这个呢,又是N的,那上面呢,我们还是得把这个啊diim呢写一下。
22:01
嗯,这块呢,咱们说符号呢,可以很多啊,我用这个招乐符的话呢,也可以用于表示咱们这个结束。嗯,那我就用到福。啊,再给大家还原回去,这就可以了,行,那么这里边我们触发的这个触发器,它要做什么事呢?就是咱们把这个输把这个这个呃。Log这个表里边呢,去添加一条记录,那跟这个是类似的,对吧,我就直接CTRLC了。哎,我拿过来,那这个咱就别写before了,咱们写一个叫after吧。能理解是吧,好这就可以了,行,然后呢,我们就选中咱当前的这样的一个存,呃,这个触发器啊,走起。执行成功了,那现在的话呢,我们作用在这个表上的话,实际上它的一个隐色的行为呢,是有两个触发器的,那有两个触发器,你可以绑定多个,那他们都会去执行的,好了,这个完事以后呢,下边又得是一个测试。测试,那么测试之前呢,咱们首先呢,先看一下这个表中的记录。那会儿的话呢,咱们往这个表里边儿添加了一条记录,然后同步的话呢,在添加之前的话呢,是不是就有这个信息了,这个是OK的,好,那么下边的话呢,我们再去往咱们这个表里边去加入一条记录。
23:10
这个换一个,比如叫这个jarret。那我们选择啊走起可以了,然后呢,我们再来看一下这个,嗯,这个表本身啊,那肯定是多了一条记录嘛,然后我们再来看这个表里边啊走起好,大家你看此时的话呢,这个呢是咱们当时那个Tom添加的时候的信息,然后下边这一组的话呢,相当于是咱们这个Jerry添加的时候,那我们呢,在这个添加之前,咱们是触发的刚才上上面写的那个触发器了,然后这个呢,是添加之后啊触发的是我们这个,所以呢,它先后顺序呢,你看是一个是之前的,一个是之后的。这个意思,那我现在这块呢,要是再执行一次呢,我叫杰瑞一是吧,哎,我们选中了再执行。然后我们这块查看的话呢,肯定是多了一个叫JAVA1了,然后这块呢,是不是又会多一组啊。那这不就多一组吗?哎,就是这样一个场景。啊OK啊,大家呢,去关注一下好,那这样的话呢,我们就举了这两个例子了,那接着我们再来看一下这个举例三。
24:05
哎,通过这两个例子呢,大家应该对我们这个触发器呢,哎,它什么时候执行啊,怎么样去写,应该有一个直观的一个感觉了,好,我们看一下这个举例三啊,CTRLC。站过来。嗯。嗯,好,来我们看下这个问题啊,说这个呢,定一个触发器叫呃,定一个触发器啊叫salary啊下划线啊check trigger,基于员工表叫employees的一个insert事件啊,是基于insert,在这个insert之前呢,我们去检查将要添加的新员工的薪资是否大于他领导的这个薪资啊,是否大于他领导的薪资,说如果呢,你要是大于这个领导的薪资的话呢,我们就报一个叫s state value,咱们前面讲过这个程序报错的这个事儿是吧?诶那这块呢,你注意一下,就是我们自己写了一个触发器,这个触发器呢,在检查一个行为的时候呢,不满足了我们去报的一个一个错误,这个错误的话呢,不是系统会报的,是我们,诶自己人为加入的这样的一个,相当于是个呃,双引号的一个约束一样,是吧,我们自己加入的一个限制,他不满足的时候报一个错误信息,这呢,其实还隐含了一个新的知识点,我们怎么去让他报出这个错误信息。
25:19
是这意思吧?嗯,这块呢,这个基本情况呢,我们就比较清楚了,嗯,需要用到的就是咱们还得用员工表了,目前呢,咱们这里边儿没有员工表,那咱还得去这个准备一下啊,相当于是一个准备工作。OK啊,那咱们就做吧,Create table叫employees,我还这样弄,咱们前面的都弄了好多次了啊,Selecting from at,硅谷。DB下的。啊,Employees这意思吧,嗯,将我们这个艾特硅谷DB,把这个数据库下的这个表呢,完全的复制一份,放到我们当前这个数据库下来走起。好,这是一个,然后再接着。
26:02
啊,Create一个table depart。问词是吧,As?啊,Select星来from一下at硅谷DB下的departments来这个表来,我们把它呢也选中的都起一下。好的,那么这样的话呢,我们就把是不是这两个呢,这个表呢,是不是就都创建成功了,那创建成功以后的话呢,嗯,这里边儿提到了,咱们是往这个,嗯员工这个表里边呢,去添加数据啊添加数据的时候呢,判断它是不是大于这个领导的这个薪资,嗯这块呢,咱们这个表中的字段呢,好像还比较多一些啊。表中字段比较多一些,那添加的时候呢,大家得小心一下这个事儿啊,现在我主要担心的就是这个字段的问题,你看咱们这个employees,所以这块咱们倒是没有用到这个部门表是吧,主要是关于这个员工表啊,往这里边添加的时候呢,这个字段有点多哈。这个大家呢,稍微的这个留意一下。嗯,好,这个准备工作就做到这儿,然后下边的话呢,我们就开始去创建这个触发器呗。
27:03
创建触发器啊,Create。那这个trigger。起个名字啊,就这个名粘过来。And。那就它对吧,然后呢,咱们是叫,嗯,这个在是不是叫添加之前啊,你要添加之前的话呢,是不是满足这个事,如果要是这个你要大于的话呢,我们直接就报错了,就没让他添加成功,所以说这个一定要写成是一个before。那before一下是不是叫insert?啊,Inside怎么着呢,是不是on呀?哎,这个别一不小心写这个into啊,On这个employees是吧。啊一肉啊没问题,然后呢,这块又是个begin啊,然后一个摁啊这个你比如说用它吧,那前面的这个先补上。诶诶这样啊,然符号一下好,那这块呢,我们回顾一下啊,咱们需要怎么去实现呢。
28:03
啊,怎么去实现,当我们往这个表里边,哎,这个表里边儿去添加数据的时候呢,诶,它这块呢,就需要判断一下,呃,添加的这一条数据,它的一个salary啊,添加这条数据的salary,我们需要拿到。拿到以后的话呢,判断一下呢,你当前添加这条记录的salary跟我们,呃,这个这个员工,这个员工他可能会有领导对吧,这个员工的领导的那个工资还得找到啊,然后看这谁大谁小的问题,诶所以这个呢,比我们想的呢,上面这个触发器呢,稍微要复杂一点啊,那我们这里边呢,是不是需要呃,找到的事儿是什么呢?你看我们的需求啊,是不是要查询到。这个要添加的。要添加的这个数据的manager的。是不是它的一个性质啊。啊,是这意思吧,嗯,那你看正常咱们前面写的话呢,咱们要查询他的管理者的这个薪资,那咱们就是select一下,嗯,这个管理者的manage ID呢,咱们知道的,咱们直接看他的一个salary就行,是吧,然后from一下咱employees where一下咱们这个employee ID,啊应该等于呢,是不是你这个这个现在添加这个员工的啊,这个员工的是不是叫嗯managed了,哎,咱们现在添加的这个员工这么来表示啊,这块呢,是一个新的知识点啊,咱们要insert到这个表中的这条记录呢,咱们可以用new呢来表达。
29:31
哎,New呢,就是你现在要添加的这一条记录,比如说我要添加多条呢,或者我们这个还有update和delete,你多条呢,多条呢,咱们这不是有这个for each row嘛,就是你每呃这个比如增三改一条,那我们呢,你那一条就都是new。啊,但是你注意这个事儿就行。诶对,这块这个你添加的话,这块叫new,你要删的话呢,那删的这个呢,相当于就是old了啊,咱们课后练习题里边有这个事儿啊,一会儿再说那个就我们现在添加的时候呢,这是个new的,那new的这一条记录的,它是不是会有一个叫many idea。
30:05
对吧?诶那么我们就找到你要添加的这一条记录它的manage ID,根据这个manage ID呢,咱们就找到,诶你看哪个员工的employd呢,是这个manage ID,就相当于找到这个员工他的一个工资,是不是就找到了这个工资的话呢,咱们得需要呢,把它放在一个变量当中,所以呢,我们需要呢,去做一个declare是吧。啊,Declare一下,这个我们叫MGRR的一个,哎,Salary吧,哎是一个double类型的啊没有问题,然后呢,下边呢,相当于针对这个变量我们做个赋值,说select salary是不是就into啊,那我们这个MGRR它的一个icr当中,那这个呢,清楚啊。换下行吧,好,那那这个时候呢,我们就诶相当于找到这样一个工资了,下边呢,是不是就做一个判断呀,说如果呢,你当前你这个new这条记录的它的一个salary,哎如果你的salary呢,是大于,比如说等于吗。啊,是个大于啊,没说等于,那我们就直接大于吧,如果你的这个新员工的这个工资呢,是大于了我们管理者的。
31:02
CTRLC啊,CTRLV大于了这个管理者的他的一个salary啊,那这时候我们需要呢,是不是就得震一下,得做点事了啊做什么事呢,你得抛一个这个,这个相当于是一个错误了,说呢,你这个这个不行是吧,那你得报一个这样的信息啊,这个事儿怎么做呢?这就相当于是一个新的知识点。啊,这是一个新的知识点啊,大家这样去写啊,就是我这里边写的啊,如果呢,你发现你当前这个新的这条记录的工资大于你管理者的这个工资了,哎,我们需要这么着去处理。哎,CTRLC一下。哎,这块呢,大家你就知道这个一个固定格式呢就行了。哎,固定格式就行了,我们报一个呢,叫a signal,叫a circle state,我们自己呢,给它起了一个这个字符串,这样一个错误的一个标识,然后set一个叫message啊test,说薪资呢,高于领导薪资的错误,这是咱们完全自己定义的这样一个错误信息。行,咱们自己定义的啊好,那么这样完了以后呢,我们就直接去摁一下if就结束了。
32:00
啊,就是你要是这个怎么说呀,呃,发现满足这个事儿的话呢,我们就报这样粗心,你要没有满足这个事儿呢,没有满足的话呢,我们这块呢,整个这个触发器不就结束了嘛,相当于这个数据呢,就能够添加成功。啊,那你要是呃,报了一个信息的出现错误了,咱们错误以后呢,是不是程序就不会继续向下执行了呀。哎,那你程序呢,相当于就是添加就会失败呗。嗯,OK啊好,那么这个时候呢,我们创建好以后呢,整个选中咱们从这到这儿啊给他走一下。好,成功了啊,成功以后的话呢,哎,下边这个来测试了,这个测试呢,为什么苦笑一下呢,因为我们这个员工标准字段呢有点多哈,哎,咱们desa一下,再看一下这个表。啊,这这是它这个字段,这个字段呢,咱们添加的时候呢,咱就别都讲了,咱们把这个这个标识为这个空,呃,非空的这个咱们给它加上啊,我就insert into这个employees是吧,哎,长舒一口气啊。嗯,Employee ID给它加上。这个还有什么呢?Last name给人家加上。
33:04
这个email加上。这写的闹闹的,你都得给人加上。还有这个hard data不少呢啊。还是这得加上,然后还有一个呢,叫招外地这个加上。没有了。那就这些是吧,但是这块你别丢了啊,咱们添加这条记录的话呢,你是不是还得指明它的这个叫managed啊,嗯,还有你自己的salary,咱们因为上边这个触发器主要就看工资的事嘛,你的工资是多少,还有你的管理者是谁。哎,所以这几个这俩字段也别少了啊,Values咱们就填那这块我们去select一下先。From an employees。来我们这块呢,先看一下这个表中的这个字段啊,这个数据,这个数据的话呢,我们给这个员工先给他挑一个管理者吧。嗯,先说一下,目前这些字段的话呢,它是到206了啊,其实这个employ ID呢,我们可以不去赋值啊,因为它是个主键了是吧?啊这块你要赋的话呢,你就避开这些数,你自己写一个,比如说我写一个这个啊300是吧,这也可以啊。
34:07
然后呢,给他选一个领导者。嗯,随便挑一个,比如说这里边103吧,103的这个我们现在需要知道他的工资是多少,103的工资呢,是9000块钱,好,这个事呢是一个重要的信息。诶,那我们回过来呢,现在给他付最后这俩字段的时候呢,工资付多少呢,我们付一个先付一个8000吧。OK吧,然后呢,我再附一个这个就是103,这个是他的管理者是吧,好,然后我们再把其他几个字段给他补齐啊,这个你小心一点。这个我们比如说叫汤姆。这是它的一个lastname,然后email。那126.com。哎,逗号一下这个her data啊her我们就写个叫哎her date。嗯,赵白地。嗯,赵波ID在咱们写一个。嗯,这个吧,比如说ad下划线,然后VP啊,这个级别挺高的啊,Ad是VP的啊。
35:04
Vice President是吧?好,这个ad相应VP啊,然后这块逗号一下。Salary这个,然后manage ID啊这个行没问题,那这块的话呢,我们添加呢,其实没有触发它这里边这个触发器,因为咱们这个呃触呃触发触发器了啊,这个我说错了,触发这个触发器了,但是没有进去我们这个if对吧。嗯,好的,来,我们此时呢,选中呢,执行一下。把这个我们就去了,执行完以后的话呢,我们这时候再去做一个select。来我们这块呢,往下看,诶是不是我们把这个Tom呢,就给它加进去了啊,这块呢,你感觉好像触发器呢,没有起作用是吧,实际上这个触发器执行了,只不过呢,人家这里边儿这个逻辑呢,没有阻拦你啊,你就接着往后去走了啊是这个场景,这就相当于是我们添加成功。切换成功啊,但这我们注意啊,依然这个哎触发了,哎触发器的执行。
36:01
那这个触发器呢,针对就是我们上面这个触发器,CTRLC一下。嗯,这个注意一下行,那接下来的话呢,我们再去添加另外一条记录啊,我CTRL一下。这个呢,比如我叫301,或者叫TOM1万啊,就简单一点啊,还叫它这个呢,我改成1万。刚才呢,我们看到呢,这个103他的工资呢,是9000块钱对吧。那几万块钱,现在我改成1万了啊,这个管理者呢,还是103,那此时呢,我们在选中呢去执行。好,但是你看此时的话呢,他就报了一个错误信息,说薪资高于公司这个领导的这个薪资,这相当于我们添加呢,就失败了。哎,这个呢就添加失败,那这个呢,照样呢,是触发了这个触发器的一个执行,那此时呢,我们去选中呢,去执行一下。好,这个我们往后拽啊,往下走。好,但是你看是不是我们,呃,108个数据是不是就缺你这个汤姆一这个数据啊,相当于添加没有成功,那有同学为什么没有成功呢?因为我们这里边出错了,咱们前边讲这个,嗯,变量。
37:02
啊,咱们这个课件里边讲这个变量流程控制合理由标的时候呢,中间我们还穿插了一个内容,是不是就讲了一下叫这个,呃,定义条件和处理程序啊,咱们呢,这里边没有,其实没有定义这个处理程序是吧?那当然我们讲到说你要是在程序过程执行过程当中,要是出现这个错误信息的时候呢,我们就会退出当前的SQL逻辑,不会继续向下执行了,那咱们这呢,相当于就是出现这样问题了,当咱们出现这样的一个错误信息的时候呢,程序就不会继续向下执行,那因为你是在隐私的之前呢,就出现了,哎,这个错误信息了,不会向下执行,那意味着你这个隐塞到这个表中的这个行为呢,就没有发生嘛。哎,就出现这个问题了,如果你说呢。如果你希望呢说呃,出现这个错误的话呢,还要继续执行,那你就去再再去看咱们这一章里边讲的这个定义处理程序,那我们把这个抛出来的这个错误呢,你是不是在这块处理一下,那就可以让他呢,是不是去continue啊。啊,让他continue,那你就可以让他去添加成功啊,这是我们前面已经讲过的这个内容了啊OK,行,那这样话呢,咱们把这个嗯,举例三的话呢,就也给大家去说清楚了啊这呢,相当于是咱们诶自定义的一个这样触发器的一个应用场景。
38:09
那这块呢,咱们就先告一段落。
我来说两句