12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
ADADADADAD
mysql数据库 时间:2024-12-25 09:57:27
作者:文/会员上传
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
MySQL的触发器和存储过程一样,都是嵌入到MySQL的一段程序。触发器是由时间来触发某个操作,这些时间包括INSERT、UODATE和DELETE语句。如果定义了触发程序,当数据库执行这些语
以下为本文的正文内容,内容仅供参考!本站为公益性网站,复制本文以及下载DOC文档全部免费。
MySQL的触发器和存储过程一样,都是嵌入到MySQL的一段程序。触发器是由时间来触发某个操作,这些时间包括INSERT、UODATE和DELETE语句。如果定义了触发程序,当数据库执行这些语句的时候就会触发执行相应的操作,触发程序是与表有关的命名数据库对象,当表上出现特定事件时,当激活该对象。
11.1、创建触发器
触发器是一个特殊的存储过程,不同的是,执行存储过程要使用CALL语句来调用,而触发器的执行不需要使用CALL语句来调用,也不需要手工启动,只要当预定义的时间发生的时候,就会被MySQL自动调用。
创建一个触发器的语法为:
CREATETRIGGERtrigger_nametrigger_timetrigger_eventONtbl_nameFOREACHROWtrigger_body
trigger_name:触发器名称,用户自行指定
trigger_time:触发时机,可以指定为before或after
trigger_event:标识触发事件
tbl_name:标识触发器的表名
trigger_body:触发器执行语句
创建一个单执行语句的触发器:
mysql>CREATETABLEaccount(acc_numINT,amountDECIMAL(10,2));QueryOK,0rowsaffected(0.06sec)mysql>CREATETRIGGERins_sumBEFOREINSERTONaccount->FOREACHROWSET@sum=@sum+NEW.amount;QueryOK,0rowsaffected(0.02sec)mysql>SET@sum=0;QueryOK,0rowsaffected(0.00sec)mysql>INSERTINTOaccountVALUES(1,1.00),(2,2.00);QueryOK,2rowsaffected(0.02sec)Records:2Duplicates:0Warnings:0mysql>SELECT@sum;+------+|@sum|+------+|3.00|+------+1rowinset(0.00sec)
创建多个执行语句的触发器的语法:
CREATETRIGGERtrigger_nametrigger_timetrigger_eventONtbl_nameFOREACHROWBEGINtrigger_stmtEND
11.2、查看触发器
查看触发器是指查看数据库中已存在的触发器的定义、状态和触发信息等可以通过SHOW TRUGGERS和在triggers表中查看触发器信息。
mysql>CREATETABLEmyevent->(->idint(11)DEFAULTNULL,->evt_namechar(20)DEFAULTNULL->);QueryOK,0rowsaffected(0.03sec)mysql>CREATETRIGGERtrig_updateAFTERUPDATEONaccount->FOREACHROWINSERTINTOmyeventVALUES(1,'AFTERUPDATE');QueryOK,0rowsaffected(0.05sec)mysql>SHOWTRIGGERS\G***************************1.row***************************Trigger:ins_sumEvent:INSERTTable:accountStatement:SET@sum=@sum+NEW.amountTiming:BEFORECreated:NULLsql_mode:Definer:root@localhostcharacter_set_client:utf8collation_connection:utf8_general_ciDatabaseCollation:utf8_general_ci***************************2.row***************************Trigger:trig_updateEvent:UPDATETable:accountStatement:INSERTINTOmyeventVALUES(1,'AFTERUPDATE')Timing:AFTERCreated:NULLsql_mode:Definer:root@localhostcharacter_set_client:utf8collation_connection:utf8_general_ciDatabaseCollation:utf8_general_ci2rowsinset(0.00sec)
在MySQL中所有触发器的定义都存在INFORMATION_SCHEMA数据库的TRIGGERS表中,可以通过SELECT 来查看,其语法格式为:
SELECT*FROMINFORMATION_SCHEMA.TRIGGERSWHEREcondition;
mysql>SELECT*FROMINFORMATION_SCHEMA.TRIGGERSWHERETRIGGER_NAME='trig_update'\G***************************1.row***************************TRIGGER_CATALOG:defTRIGGER_SCHEMA:testTRIGGER_NAME:trig_updateEVENT_MANIPULATION:UPDATEEVENT_OBJECT_CATALOG:defEVENT_OBJECT_SCHEMA:testEVENT_OBJECT_TABLE:accountACTION_ORDER:0ACTION_CONDITION:NULLACTION_STATEMENT:INSERTINTOmyeventVALUES(1,'AFTERUPDATE')ACTION_ORIENTATION:ROWACTION_TIMING:AFTERACTION_REFERENCE_OLD_TABLE:NULLACTION_REFERENCE_NEW_TABLE:NULLACTION_REFERENCE_OLD_ROW:OLDACTION_REFERENCE_NEW_ROW:NEWCREATED:NULLSQL_MODE:DEFINER:root@localhostCHARACTER_SET_CLIENT:utf8COLLATION_CONNECTION:utf8_general_ciDATABASE_COLLATION:utf8_general_ci1rowinset(0.00sec)
11.3、触发器的使用
触发程序是与表有关的命名数据库对象,当表上出现特定时间时,将激活该对象。
创建一个在account表插入数据之后,更新myevent数据表的触发器。
mysql>CREATETRIGGERtrig_insterAFTERINSERTONaccount->FOREACHROWINSERTINTOmyeventVALUES(2,'AFTERINSERT');QueryOK,0rowsaffected(0.02sec)mysql>INSERTINTOaccountVALUES(1,1.00),(2,2.00);QueryOK,2rowsaffected(0.01sec)Records:2Duplicates:0Warnings:0mysql>SELECT*FROMmyevent;+------+--------------+|id|evt_name|+------+--------------+|2|AFTERINSERT||2|AFTERINSERT|+------+--------------+2rowsinset(0.00sec)
11.4、删除触发器
使用DROP TRIGGER语句可以删除MySQL中已经存在的触发器,其语法格式为:
DROPTRIGGER[schema_name.]trigger_name
删除一个触发器
mysql>DROPTRIGGERtest.ins_sum;QueryOK,0rowsaffected(0.02sec)
11-20
11-19
11-20
11-20
11-20
11-19
11-20
11-20
11-19
11-20
11-19
11-19
11-19
11-19
11-19
11-19