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;