大白糖奶兔的Blog
大白糖奶兔的Blog
数据库第八章-触发器

概述

触发器是每当与表关联的事件发生时自动调用的函数
事件包括(insert,update,delete,truncate截断)

两种主要触发器

  • 行级触发器(插入、修改、删除一行数据,触发一次)
  • 语句级触发器(语句执行一次,触发器执行一次,与行无关)

区别在于触发触发器的时间和次数(如果发出update影响20行的语句,则行级触发器被调用20次,而语句级触发器调用一次)

还可以分为
- 事件之前调用触发器(前置触发器):插入数据之前检查数据
- 事件之后调用触发器(后置触发器):统计数据

创建触发器

首先,用create function创建触发函数

create function trigger_function()
    returns trigger as

触发器程序中可以使用的两个记录型变量:old(inserted)和new(deleted)
- 当发生insert时,new(inserted)有值
- 当发生delete时,old(deleted)有值
- 当发生update时,都有值(修改之前old里,修改之后new里)

其次,用create trigger语句将触发器函数绑定到表

create trigger trigger_name
{before | after | instead of} {event [or ...]} on table_name
[for [each] {row | statement} ]
execute procedure(function) trigger_function
https://yczbest.cn/wp-content/uploads/2020/08/wp_editor_md_74fbe52894e67f80cb72d6a70edb13ef.jpg

案例

案例数据

商品入库表

商品编号 入库日期 入库数量
1001 05/06/01 80
1001 06/07/02 100
1002 05/06/02 50
.... ........ ....

商品出库表

商品编号 出库日期 出库数量
1001 05/06/10 20
1001 05/06/20 50
1002 05/07/01 15
.... ........ ....

商品库存表

商品编号 库存数量
1001 110
1002 25
.... ...

建表

create table rk
(spbh int,rkrq date,rksl int);
create table ck
(spbh int,ckrq date,cksl int);
create table kc
(spbh int, kcsl int);
https://yczbest.cn/wp-content/uploads/2020/08/wp_editor_md_bf5a685ed58c5e4f8f9470e4cbef5fe2.jpg

创建触发器函数

create or replace function  tg_rkinsert() 
returns trigger
AS $BODY$
begin
    if  (select spbh from kc where spbh=new.spbh) is null
    then
         insert into kc  values(new.spbh,new.rksl);                 
     else
         update kc set  kcsl=kcsl+new.rksl where spbh=new.spbh;
     end if;
     RETURN NEW;
end;
$BODY$ LANGUAGE plpgsql;

创建触发器

CREATE TRIGGER rkinsert
  AFTER INSERT
  ON rk
  FOR EACH ROW
  EXECUTE PROCEDURE tg_rkinsert();

发表评论

textsms
account_circle
email

大白糖奶兔的Blog

数据库第八章-触发器
概述 触发器是每当与表关联的事件发生时自动调用的函数 事件包括(insert,update,delete,truncate截断) 两种主要触发器 行级触发器(插入、修改、删除一行数据,触发一次) 语句级触…
扫描二维码继续阅读
2020-08-20
Title - Artist
0:00