心尊门 发表于 2019-8-30 13:43:00

数据库之——触发器(学习笔记)

一、触发器的定义:

触发器(TRIGGER)是由事件来触发某个操作。这些事件包括INSERT语句、UPDATE语句和DELETE语句。当数据库系统执行这些事件时,会激活促发其执行相应的操作。

二、创建与使用触发器:

2.1创建只有一个执行语句的触发器



例:创建一个trig_book触发器,该触发器在表t_book插入一条数据后,对表t_bookType的bookNum数量对应的bookTypeId会自动加1

create trigger trig_book after insert

         on t_book for each row

                  update t_bookType set bookNum = bookNum+1 where new.bookTypeId = t_booktype.id;

INSERT INTO t_book VALUES(NULL,'java好',100,'ke',1);

t_book表:



t_bookType表:



2.1创建有多个执行语句的触发器



例子:

DELIMITER |   数据库语句   | DELIMITER;//告诉数据库这时一条语句内容

new   old   触发的两个过度变量;new:新增一条语句的新增对象;old:删除一条语句的删除对象;

DELIMITER |

create trigger trig_book2 after delete

    on t_book for each row

    begin

          update t_bookType set bookNum = bookNum-1 where old.bookTypeId=t_booktype.id;

          insert into t_log values(null,NOW(),'在book表里删除了一条数据');

          delete from t_test where old.bookTypeId = t_test.id;

    end

|

DELIMITER ;

DELETE FROM t_book WHERE id=5;
三、查看触发器

3.1SHOWTRIGGERS 语句查看触发器信息

SHOW TRIGGERS;

3.2 在 triggers 表中查看触发器信息

DROP TRIGGER trig_book2 ;



----------------------------------------------------------------------------------

触发器

触发器的作用是使某些语句在事件发生时自动执行,只支持 delete,insert,update语句。

1.查看触发器
show triggers;
2.创建触发器

需要给出4条信息:唯一的触发器名(建议),触发器关联的表,触发器响应的某些语句,触发器何时执行(前或后)
create trigger 触发器名 时间(before或after) 操作(insert,delete,update) on 表名 for each row 触发器程序体(可以是一句SQL语句,或者用 BEGIN 和 END 包含的多条语句)
3.删除触发器
drop trigger 触发器名
注:触发器不能更新或覆盖,要修改的话只能删除然后重新创建

4.实使用触发器

① insert 触发器

在insert触发器的代码内,可以引用一个名为new的虚拟表,访问被插入的行;

在before insert触发器中,new虚拟表中的值可以被更新(允许更改被插入的值);

对于auto_increment列,new虚拟表在insert执行之前包含0,在insert执行之后包含新的自动生成值。

例:
create trigger neworder after insert on orders for each row select new.order_num;
分析:

创建一个名为neworder的触发器,在有数据插入到orders之后执行。在插入一个新的数据到orders表时,mysql生成一个新订单号并保存到order_num中。触发器从new.order_num取得这个值并返回。对于orders每次插入使用这个触发器总是返回新的订单号。

注:

5.0以上版本会出现如下错误,因为5.0以后版本的mysql在TRIGGER中不能返回结果集

#1415 - Not allowed to return a result set from a trigger

② delete 触发器

在delete触发器代码内,可以引用一个名为old的虚拟表,访问被删除的行;

old中的值全部为只读的,不能更新。
create trigger deleteorder before delete on orders for each row
begin
    insert into archive_orders(order_num,order_date,cust_id) values(old.order_num,old.order_date,old.cust_id);
end;
分析:

在任意订单被删除前执行此触发器。使用一条insert语句将old中的值(即要被删除的订单)保存刀一个名为archive_orders的存档表中。

③ update 触发器

在update触发器中,可以引用一个名为old的虚拟表访问以前(update语句前)的值,引用一个名为new的虚拟表访问新更新的值;

在before update触发器中,new中的值可能也被更新(允许更改将要用于update语句中的值);

old中的值全部都是只读的,不能更新。

例:
create trigger updatevendor before update on vendors for each row set new.vend_state = upper(new.vend_state);
分析:

在每次更新一个行时,new.vend_state中的值(将用来更新表行的值)都会用upper(new.vend_state)替换。

5.触发器的执行顺序

① 如果 BEFORE 触发器执行失败,SQL 无法正确执行。
② SQL 执行失败时,AFTER 型触发器不会触发。
③ AFTER 类型的触发器执行失败,SQL 会回滚。

页: [1]
查看完整版本: 数据库之——触发器(学习笔记)