创建一个名为stu_insert的触发器,当向学生表student中插入记录时,自动更新班级表class中的学生人数numbe

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了创建一个名为stu_insert的触发器,当向学生表student中插入记录时,自动更新班级表class中的学生人数numbe相关的知识,希望对你有一定的参考价值。

参考技术A

1、首先打开sqlyog并和mysql建立连接。

2、在sqlyog软件左侧树形菜单中要到触发器选项。

3、在触发器选项上点击右键找到创建触发器选项,或者选择触发器选项按f4也可以弹出创建触发器弹窗。

4、想要创建一个名称为trigger的触发器,那么就在弹窗的输入框中输入trigger并点击确定即可。

5、想要创建一个biao1中插入数据后,另外一个表pages也 要插入数据的触发器,触发器的命令是 after insert on biao1。

6、当biao1插入数据的时候 ,想要pages也要插入数据,就要在for each row begin后加  

INSERT INTO pages(title,logo,content,ADDTIME) VALUES('触发器','触发器logo','触发器content','2018-8-16')。

7、在询问编辑器中 创建一个插入biao1的sql语句INSERT INTO biao1(name1,age) VALUES('新加name','111'),f9执行该语句将数据插入表中。

以学生表实例来补充 触发器和游标操作

这是学生表里面的内容:

 

现在创建一个Avgtable表:

select Sno, AVG(Grade) avgGrade into Avgtable from SC
group by Sno

--情况是这样子的:
--当向SC表中做插入操作的时候,插入数据的时候 Avgtable表是要改变数据的:
-- 1.当插入Avgtable表中目前没有的学生的数据的时候就直接插入
-- 2.当插入Avgtable表中已经有的学生的数据的时候就要求要改变avgGrade的值
--触发器做插入的时候:

alter trigger tri_Test on SC for insert,delete
as 
if not exists(select * from Avgtable, inserted where Avgtable.Sno = inserted.Sno)
insert into Avgtable select Sno, Grade from inserted
else
begin
declare @Sno varchar(7)
select @Sno = Sno from inserted
update Avgtable
set avgGrade = (select AVG(Grade) from SC where Sno = @Sno)
where Sno = @Sno
end

 


--测试:
insert into SC values (\'2017001\',\'2\',88)


--当插入多条记录的时候:
insert into SC values
(\'2017004\', \'1\', 90),
(\'2017004\', \'2\', 80),
(\'2017004\', \'3\', 40)

为什么会出现错误?
是因为当插入多条纪录的时候 触发器 中 inserted 表中会有三条记录
if not exists(select * from Avgtable, inserted where Avgtable.Sno = inserted.Sno)
这个条件刚好成立 然后就进入了 insert into Avgtable select Sno, Grade from inserted
将会把inserted表中的三条纪录全部插入到Avgtable表中。

解决办法就是使用游标:
--创建触发器(使用游标):

alter trigger tri_OnSC on SC for insert
as 
declare culInsert cursor for select Sno,Cno,Grade from SC
open culInsert
declare @Sno varchar(7), @Cno char(1), @Grade int 
fetch next from culInsert into @Sno, @Cno, @Grade
while @@FETCH_STATUS = 0
begin 
if not exists(select * from Avgtable where Sno = @Sno)
insert into Avgtable values(@Sno, @Grade)
else
update Avgtable
set avgGrade = (select AVG(Grade) from SC where Sno = @Sno)
where Sno = @Sno
fetch next from culInsert into @Sno, @Cno, @Grade
end
close culInsert
deallocate culInsert

 

以上是关于创建一个名为stu_insert的触发器,当向学生表student中插入记录时,自动更新班级表class中的学生人数numbe的主要内容,如果未能解决你的问题,请参考以下文章

数据库触发器问题

创建 Oracle SQL 触发器错误

第19讲++触发器

mysql的 视图触发器事务存储过程函数索引与慢查询优化

在SQL2008中我要创建个更新(UPDATE)触发器

使用数据库语句 有学生表和班级信息表,创建触发器,如果有学生转系,则相应系人数也一并修改。