数据库 触发器
Posted su-feng-address
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库 触发器相关的知识,希望对你有一定的参考价值。
触发器是一种与表操作(insert , update, delete)有关的数据库对象,
触发器定义了一系列操作,这一系列操作称为触发程序,当触发器所在表上出现了insert,update及delete操作时,将激活触发器,即表的操作事件触发表上的触发程序的执行。
触发器基于一个表创建,但是可以针对多个表进行操作,所以触发器可以用来对表是是复杂的完整性约束。
触发器具有以下优点:
(1)触发器自动执行,当对表进行insert,update,以及delete操作时,视图修改表中的数据时,相应操作的触发器立即自动执行。
(2)触发器可以通过数据库中相关表进行层叠更改,这比直接把代码写在前台的做法更安全合理。
(3)触发器可以实现表的约束实现不了的复杂约束,在触发器可以引用其它表的列,从而实现多个表之间数据的约束。
(4)触发器可以维护冗余数据,实现外键级联选项等。
触发器定义:::
create triggger mytrigger before(after) insert(update/delete) on 表名 from each row begin .... end;
1 触发器是数据库对象,因此创建数据库触发器时,需要指定该触发器属于哪一个数据库。
2 触发器时在表上创建的,这个表必须是基表。
3 mysql触发事件有三种 insert,update,delete
4 触发器在触发时间上有两种,即before , after
目前 mysql支持行级触发器,不支持语句级别的触发器
触发程序中可以使用old关键字与new关键字,
当向表中插入某条新记录,在触发程序中可以使用new关键字表示新记录,当需要访问新记录的某个字段时,可以使用new.字段名 进行访问。
当从表中删除某条旧记录时,在触发程序中可以使用old关键字表示旧记录,当需要访问某个旧记录中的某个字段时,可以使用“old.字段名”进行访问。
修改...,修改前 old ,,,修改后new ,,,
触发器检查功能:
# 检查插入的成绩是否符合实际情况
delimiter // create trigger mytrigger before insert on table1 FOR EACH ROW BEGIN IF(new.score is not null&&new.score<0) then set new.score=0; else if (new.score is not null &&new.score>100) then set new.score=100; Endif; End;// delimiter ;
触发器维护冗余数据:
# 使用触发器,将退休老师的数据删除并保存到历史数据库old_teacher表中
delimiter // create trigger mytrigger after delete on teacher for each row begin insert into old_teacher(tname,tgender,tpr,o) values(old.tname,old.tgender,old.tpro) end; // delimiter;
对于Innodb存储引擎的表,支持外键约束关系,在定义外键约束时,可以通过设置外键级联选项cascade,set null, 或者No action(restrict)外键约束关系可以交由InnoDB存储引擎自动维护,外键级联选项CASCADE,SET NULL或者NO ACTION(RESTRICT)含义如下:
1. CASCADE : 当从父表中删除或更新对应的行,同时自动的删除或更新子表中匹配的行。 ON DELETE CASCADE 和ON UPDATE CASCADE都被innoDB 所支持。
2 SET NULL: 从父表中删除或更新对应的行,同时将子表中的外键列设为空,注意,这些在外键列没有被设为Not null 时有效,ON DELETE SET NULL 和 ON UPDATE CASCADE都被Innodb所支持,
3 No action: innoDB 拒绝删除或者更新父表
4 RESTRICT: 拒绝删除或者更新父表,指定RESTRICT或者NOT ACTION和忽略ON DELETE或者ON UPDATE选项的效果时一样的。
对于Innodb存储引擎的表之间存在外键约束关系但不存在级联选项;或者使用的数据库表为MyISAM(MyISAM表不支持外键约束关系),
此时使用触发器来实现外键约束之间的级联选项。
问题描述:
数据库中有学生表stu和宿舍表dorm,学生表stu中有学号sno,姓名sname,班级sclass等字段,主键为sno学号,宿舍表中有宿舍号dno,床位号bno,学号sno等字段,宿舍号和床位号联合起来做主键,分别用触发器来实现宿舍表dorm的学号sno和学生表stu的学号sno字段之间的外键级联选项CASCADE、SET NULL。
(1)创建触发器tr-1,实现宿舍表dorm中学号sno字段和学生表stu学号sno字段的外键CASCADE级联选项,当学生表删除某个学生时,宿舍表dorm中对应学生的住宿记录也被删除。
delimiter // create triggger tr_1 before delete on stu for each row begin if(exists(select * from dorm where sno=old.sno)) then delete from dorm where sno=old.sno; end if; end;// delimiter ;
(2)(1)创建触发器tr-1,实现宿舍表dorm中学号sno字段和学生表stu学号sno字段的外键SET NULL级联选项,当学生表中修改某个的学生学号时,宿舍表中对应记录的学号设为NULL.
delimiter // create triggger tr_2 before delete on stu for each row begin if(exists(select * from dorm where sno=old.sno)) then update dorm set sno=null where sno=old.sno; end if; end;// delimiter ;
# 查看当前数据库中触发器的信息 show trigger \G
# 查看与模式模糊匹配的触发器信息
show trigger like 模式\G
???
注意:当使用一个含有SHOW TRIGGERS的like子句时,待匹配的表达式(expr)会与触发器定义所在的表的名称相比较,而不是与触发器的名称相比较。
表示怀疑
??
# 查看触发器的i定义 show create trigger mytrigger;
查看触发器的定义可以从information_schema数据库里的triggers表中查询
# 查询语句如下 select * from information_schema.triggers \G
删除触发器
drop trigger mytrigger;
以上是关于数据库 触发器的主要内容,如果未能解决你的问题,请参考以下文章