当前位置:Gxlcms > 数据库问题 > 数据库 触发器

数据库 触发器

时间:2021-07-01 10:21:17 帮助过:24人阅读

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;

 

数据库 触发器

标签:针对   直接   ike   名称   事件触发   str   查看   个数   插入   

人气教程排行