mysql触发器

有一个雇员表:工龄字段,工资表。
当修改工龄时,每增加一年,相应的工资涨200元。

create table emp
(id int primary key,
name varchar(8),
workyear int);

create table gz
(id int primary key,
salary int);

insert into emp values(101,'a',5);
insert into emp values(102,'b',8);
insert into emp values(103,'c',15);

insert into gz values(101,2300);
insert into gz values(102,3000);
insert into gz values(103,4500);


create trigger emp_update after update
on emp for each row
begin
       declare years int;   
         set years=new.workyear -old.workyear;
       if years>0 then
        update gz set salary=salary+years*200 where id=new.id;
      end if;
end


update  emp set workyear =10  where id=101;

 

 

 

 

触发器可以认为是特殊存储过程。
但与存储过程不同:
1.调用方式不同:存储过程  call 通过名字调用
                                    触发器:通过事件激活   insert  update  delete
2.存储过程是数据库里的对象,在库上的。
    触发器是在表上的。


创建触发器:
create trigger  触发器名 [after|before] [insert|updat|delete]
on 表名 for each row
begin
    触发器语句内容
end

 


after: 触发器是在触发语句执行后才执行
before:触发器是在触发语句之前执行


create table table1(a int);

create trigger table1_insert  after insert
on table1 for each row
begin
     set @str='Trigger is working';
end

insert into table1 values(1);
select @str


insert: 插入的新数据可以通过   new.字段名    来引用。

update :更新前的值可以通过  old.字段名引用, 更新后的值可以通过  new.字段名引用

delete :通过  old.字段名 获取删除的旧数据。

create table test1(id int primary key,
name varchar(8),
dept varchar(20));

create trigger test1_insert after insert
on test1 for each row
begin
     set @id=new.id;
     set @name=new.name;
     set @dept=new .dept;
end


create trigger  test1_update after update
on test1 for each row
begin
    set @oid=old.id;
     set @oname=old.name;
     set @odept=old.dept;
     set @nid=new.id;
     set @nname=new.name;
     set @ndept=new .dept;
end

创建触发器的思路:
1.考虑在哪个表上创建触发器,由什么事件触发。
2.根据触发事件,去找相应的数据。到old,new中找,相关表
3.进行相应的处理。

create trigger xs_delete after delete
on xs for each row
begin
      delete from xs_kc where 学号=old.学号;
end

delete from xs where 学号='081101';

有两个结构一样的表,test1,test2,
要求当向test1表中插入一条数据时,
将相应的数据插入到test2表中。
create trigger test1_insert1 after insert
on test1 for each row
begin
       insert into test2 values(new.id,new.name,new.dept);
end


create trigger xs_kc_update before update
on xs_kc for each row
begin
     declare xf int;
    select 学分 into xf  from kc where 课程号=new.课程号;
      if new.成绩<60 then
              set  new.学分=0;
      else
               set new.学分=xf;
      end if;
end

 

update xs_kc set 成绩=90 where 学号='XX' and 课程号='xx';

旧数据:old.学号    old.课程号  old.成绩   old.学分
新数据:new.学号   new.课程号   new.成绩   new.学分

作业答案
create function f_birthday(xh char(6))
returns char(10)
begin
       if (select 专业名 from xs where 学号=xh)='计算机' then
               return (select 出生日期 from xs where 学号=xh);
       else
              return 'false';
        end if;
end


create function f_birthday1(xh char(6))
returns char(10)
begin
        declare zym char(10);
        declare aa int;
        select 专业名 into zym from xs where 学号=xh;
       select strcmp(zyn,'计算机') into aa;
       if aa=0 then
              return (select 出生日期 from xs where 学号=xh);
       else
               return 'false';
        end if;

end


create function f_birthday2(xh char(6))
returns char(10)
begin
        declare xm char(10);
       
        select 姓名 into xm from xs where 学号=xh and 专业名='计算机';
      
       if xm is not null then
              return (select 出生日期 from xs where 学号=xh);
       else
               return 'false';
        end if;

end

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值