在学习mysql不久接触到了mysql触发器这个新功能了,以前在msssql有了解过但没深入,今天要用到mysql触发器功能了,深入的整理了一些关于触发器相关技术内容,希望对各位有帮助吧.
1.创建触发器的语句:
- CREATETRIGGER<触发器名称><--
- {BEFORE|AFTER}
- {INSERT|UPDATE|DELETE}
- ON<表名称>
- FOREACHROW
- <触发器SQL语句>
- -触发器
- --createtrigger名字
- --on表名
- --触发动作
- --for/afterinsert/update/delete
- --as
- --t-sql
- select*fromshop_jb
- --insertintoshop_xsvalues(6,4000,1,GETDATE(),3)
- --updateshop_jbsetstock=stock-1whereid=6
- --创建触发器
- createtriggertri1
- onshop5_xs
- afterinsert
- as
- updateshop3_jbsetstock=stock-1whereid=6
- ---触发器更新完之后,要查看表
- createtriggertri3
- onshop3_jb
- forupdate
- as
- select*fromshop3_jb
- updateshop3_jbsetspec='sp-Z99'whereid=2
- droptriggertri1
- ---用存储过程来实现,更新完之后,要查看表
- alterprocproc1
- as
- updateshop3_jbsetspec='sp-111'whereid=2
- select*fromshop3_jb
- execproc1
- ---查看表的触发器
- execsp_helptrigger表名
- ---查看表的内容
- execsp_helptext触发器名
- ---删除触发器
- droptrigger触发器名
提示:你必须拥有相当大的权限才能创建触发器(CREATE TRIGGER),如果你已经是Root用户,那么就足够了,这跟SQL的标准有所不同.
实例:example1,创建表tab1,代码如下:
- DROPTABLEIFEXISTStab1;
- CREATETABLEtab1(
- tab1_idvarchar(11)
- );
- //创建表tab2:
- DROPTABLEIFEXISTStab2;
- CREATETABLEtab2(
- tab2_idvarchar(11)
- );//开源软件:phpfensi.com
创建触发器:t_afterinsert_on_tab1
作用:增加tab1表记录后自动将记录增加到tab2表中,代码如下:
- DROPTRIGGERIFEXISTSt_afterinsert_on_tab1;
- CREATETRIGGERt_afterinsert_on_tab1
- AFTERINSERTONtab1
- FOREACHROW
- BEGIN
- insertintotab2(tab2_id)values(new.tab1_id);
- END;
测试一下:INSERT INTO tab1(tab1_id) values('0001');
看看结果估计两个表都有相同数据,代码如下:
- createtriggertri1
- onshop3_jb
- afterinsert
- as
- select*frominserted
- insertintoshop3_jbvalues('洗衣机','aa',200,500,getdate())
- select*fromshop3_jb
- execsp_helptriggershop3_jb
- execsp_helptexttri1
- droptriggertri1
- createtriggertri2
- onshop3_jb
- afterdelete
- as
- select*fromdeleted
- deletefromshop3_jbwherenamel='笔记本'
- select*fromshop3_jb
- ---查看表的触发器
- execsp_helptrigger表名
- ---查看表的内容
- execsp_helptext触发器名
- ---删除触发器
- droptrigger触发器名
- select*fromshop5_xs
- select*fromshop3_jb
- //开源软件:phpfensi.com
补充语法
触发器 语法
3.1 CREATE TRIGGER trigger_name trigger_time trigger_event
ON tbl_name FOR EACH ROW trigger_stmt
trigger_time是触发程序的动作时间,它可以是BEFORE或AFTERtrigger_event指明了激活触发程序的语句的类型,trigger_event可以是下述值之一.
• INSERT:将新行插入表时激活触发程序,例如,通过INSERT、LOAD DATA和REPLACE语句。
• UPDATE:更改某一行时激活触发程序,例如,通过UPDATE语句.
• DELETE:从表中删除某一行时激活触发程序,例如,通过DELETE和REPLACE语句.
3.2 可能遇到的问题
如果你在触发器里面对刚刚插入的数据进行了 insert/update,会造成循环的调用,如:
create trigger test before update on test for each row update test set NEW.updateTime = NOW() where id=NEW.ID; END
应该使用set:create trigger test before update on test for each row set NEW.updateTime = NOW(); END
3.3 触发器 与存储过程
触发程序不能调用将数据返回客户端的存储程序,也不能使用采用CALL语句的动态SQL,允许存储程序通过参数将数据返回触发程序,而存储过程可以接受参数,将结果范围给应用程序.