数据库 触发器

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;

 

以上是关于数据库 触发器的主要内容,如果未能解决你的问题,请参考以下文章

导航到另一个片段时触发 API 调用

我如何使用 codeanywhere 片段

前端防扒代码片段

前端防扒代码片段

前端防扒代码片段

前端防扒代码片段