mysql触发器学习
MySQL触发器四要素:
监视地点:监视的哪个表?
监视操作:insert,update,delete?
触发操作:insert,update,delete?
触发时间:after,before?
1、创建触发器语法:
Create trigger triggerName
after/before insert/update/delete on tableName
for each row #mysql此处写死,仅支持行触发,oracle、sql_server支持表触发#
Begin
sql语句 #一句或多句 insert/update/delete语句#
End
2、删除触发器语法:
Drop trigger triggerName;
3、显示已有触发器语法:
Show triggers
对insert而言,新插入的行用new来表示,行中每一列的值用new.列名来表示。
对于delete而言,删除的行用old来表示,行中每一列的值用old.列名来表示。
对于update而言,被修改的行,修改前的数据,用old来表示,old.列名;修改后的数据,用new来表示,new.列名。
after是先完成数据的增删改,再触发,触发中的语句晚于数据的增删改。
before是先触发再做数据的增删改,触发中的语句先于监视的增删改,我们有机会判断,修改即将发生的操作。
4、deom
#deom1 — 添加订单,库存减少(商品库存表g,订单表o)
delimiter $ #定义$为结束符
truncate o$ #清空table o
create trigger tg1
after insert on o
for each row
begin
update g set num=num-new.much where id=new.gid;
end$
#demo2 — 删除订单,库存增加
create trigger tg2
after delete on o
for each row
begin
update g set num=num+old.much where id=old.gid;
end$
#demo3 — 修改订单数量,库存相应改变
create trigger tg3
after update on o
for each row
begin
update g set num=num+old.much-new.much where id=old.gid;
end$
#demo4 — before例子,判断insert 的数据是否合法
drop trigger tg1#删除掉之前的insert触发器,一个action只能有一个触发器
create trigger tg4
before insert on o
for each row
begin
if new.much>5
then set new.much=5;
end if;
update g set num=num-new.much where id=new.id;
end$
--insert 触发器
create trigger tri_insert
on student --将要进行更改的表名 for insert --给表插入一条数据的时候触发
as
declare @student_id char(10) --定义一个变量 select @student_id=s.student_id from --把查询出的指定字段的值赋值给变量student s inner join inserted i
on s.student_id=i.student_id
if @student_id=’0000000001’
begin
raiserror(‘不能插入1的学号!’,16,8)
rollback tran
end
go
--update触发器
create trigger tri_update
on student --将要进行更改的表名
for update --给表修改一条数据的时候触发
as
if update(student_id)
begin
raiserror(‘学号不能修改!’,16,8)
rollback tran
end
go
--delete触发器
create trigger tri_delete
on student --将要进行更改的表名 for delete --给表删除一条数据的时候触发
as
declare @student_id varchar(10)
select @student_id=student_id from deleted
if @student_id=’admin’
begin
raiserror(‘错误’,16,8)
rollback tran
end
解释:在删除(delete)数据的时候,可以假定数据库将要删除的数据放到一个deleted临时表中,我们可以向读取普通的表一样,select 字段 from deleted
而insert的时候道理一样,只不过是把要插入的数据放在inserted表中。
更新操作可以认为是执行了两个操作,先把那一行记录delete掉,然后再insert,这样update操作实际上就对deleted表和 inserted表的操作,所以不会有updated表了,有的时候两个表是主外键关系,想删除主表数据的同时把子表相关的数据也删除,这个时候如果用触 发器就没有效果了,因为这个触发器是在你删除表后才触发的,这个时候直接终止,提示“有主外键关系,不能删除等”,所有这样的删除触发器是没有效果的
还没有评论,来说两句吧...