我的mysql触发器笔记

触发器是与表有关的数据库对象,在满足定义时出发,并执行触发器中定义的语句集合。,这句话有三层意思:
1、某个指定的触发器必须和指定的表关联
2、触发器在满足出发条件的时候被出发
3、触发器被出发后,执行指定的语句集合。
mysql从 5.02版本开始支持触发器的功能。


CREATE
    [DEFINER = { user | CURRENT_USER }]
    TRIGGER trigger_name trigger_time trigger_event
    ON tbl_name FOR EACH ROW trigger_stmt
trigger_time :  before 或者  after   缺省值是?
trigger_event : insert<表示insert类,load data也能触发> 或者 delete 或者 update   只能是其中之一 
   上述两个参数确定了一个触发器的类型,同一张表同一类型的触发器,最多只能有一个。
trigger_stmt : ①、若这里有多行语句,则外层需要套一个  begin -  end
                ②、对于insert 型触发器,使用 new.列名 来引用新插入元组中的列值;   
                    对于delete 型触发器,使用 old.列名 来引用本次删除的元组的列值;
                    对于update 型触发器,同时使用 new 和 old  来引用 修改后和修改前的列值;


问题:

1、如A表的触发器,在插入元组的时候,自动生成一个B表的元组,插入到B表中。  后来若B表的表结构变了,则需要及时更新触发器的数值么?  还是在B表执行 alter table的时候,就会检查这个触发器,然后alter table 会失败?     - -执行alter table不会失败,但是如果再向A表中插入元组,触发执行了插入触发器,这个时候就会报错,报 XXX 列未知。 



测试代码如下:

drop table if exists b;
drop table if exists a;
create table if not exists a 
(
  id int auto_increment,
  key(id)
);
create table if not exists b
(
  idb int null default 3 ,
  name varchar(50) 
--   foreign key(idb) REFERENCES a(id) on delete no action on update no action
) ;


delimiter $
create trigger tgr_a_after_insert after insert on a
for each row 
begin
  insert into b set idb=new.id,name='unknown';
  insert into b set idb=new.id;
end;


create trigger tgr_a_update after update on a
for each ROW
BEGIN
 update b set idb=new.id where b.idb=old.id;
end;


create trigger tgr_a_delete after delete on a
for each ROW
BEGIN
  update b set idb=9999 where b.idb=old.id;
end;
$


insert into a values(1);
insert into a values(2);
update a set id=id+100;
delete from a where id=101;


select * from a;
select * from b;

你可能感兴趣的:(我的mysql触发器笔记)