MySQL第七章 触发器

1.本章目标

  触发器

2.触发器

  是一种特殊的存储过程

  触发器不能手动调用,创建好之后,会由MySQL数据库触发并执行

  分类:

    前触发器:

      brfore:在执行相应操作之前执行触发器中的代码

    后触发器:

      after:在执行相应操作之后执行粗发其中的代码

 种类:

    insert , update , delete 

 语法:

    create trigger 触发器名

    before/after

    insert/update/delete

    on 表名

    for each row

    begin 

      逻辑代码

    end

 注意:

  在触发器中想要获取更新前或更新后的数据,请使用:new  或者:old字段

  再触发器中不能使用select 输出  

create table A(
aid tinyint primary key default 0,
aname char(20) not null default '');
--完成:修改emp表数据后,记录修改前员工姓名和修改后的员工姓名
create table log(
        id int not null primary key auto_increment,
        info varchar(200)
)

create trigger tr_emp_update
after
update 
on A
for each row 
begin
    declare info varchar(200);
    declare old_name varchar(20);-- 新姓名
    declare new_name varchar(20);-- 旧姓名
    set old_name=old.aname;
    set new_name=new.aname;
    
    set info=concat('oldname:',old_name,'newname:',new_name);
    insert into log values(0,info);    
end 

update A set aname='zhangsan' where aid=1
select * from log;

--删除员工前  把编号和姓名存入log 表中
create trigger tr_emp_delete
before
delete 
on A
for each row 
begin
    declare info varchar(200);
    declare bh char(4);
    declare xm char(20);
    
    set bh=old.aid;
    set xm=old.aname;

    set info =concat('bianhao',bh,'xingming',xm);
    insert into log values(0,info);    
end
    delete from A where aid=3

--添加 数据前,判断员工编号是否已经存在,若不存在进行添加事件
create trigger tr_emp_insert
before
insert
on A
for each row
begin
    declare c int;
    declare bh char(4);
    set bh = new.aid;
    
    set c = (select count(*) from emp where aid=bh);
    if c > 0 then signal sqlstate 'TX000' set message_text='员工编号已存在';

    end if;
end
触发器

 

posted @ 2019-03-22 16:21  星梦泪痕  阅读(149)  评论(0)    收藏  举报