要创建触发器或删除触发器,请使用创建触发器
或者删除触发器
声明,描述于第13.1.22节“创建触发语句”, 和第13.1.34节“Drop Trigger语句”。
以下是一个将触发器与表关联的简单示例,以激活插
操作。触发器充当累加器,将插入到表的一个列中的值求和。
MySQL>创建表帐户(ACCT_NUM INT,数额十进制(10,2));查询OK,0行受影响(0.03秒)MySQL>在每个行设置@sum = @sum + new.amount之前插入触发器ins_sum。查询OK,影响0行(0.01秒)
这创建触发器
语句创建一个名为的触发器ins_sum.
与之相关联帐户
桌子。它还包括指定触发动作时间,触发事件以及在触发激活时执行的条款:
要使用触发器,将累加器变量设置为零,执行一个插
语句,然后看看变量后面的值:
mysql>设置@sum = 0;MySQL>插入帐户值(137,14.98),(141,1937.50),(97,-100.00);mysql>选择@sum为“插入的总金额”;+ --------------------- + |插入总金额|+ --------------------- + |1852.48 |+ ----------------------
在这种情况下,价值@和
之后插
声明已执行是14.98 + 1937.50 - 100
, 或者1852.48
。
要销毁触发器,请使用a删除触发器
陈述。如果触发器不在默认架构中,则必须指定架构名称:
mysql>删除触发test.ins_sum;
如果删除表,则表格的任何触发器也会丢弃。
触发器名称存在于架构命名空间中,这意味着所有触发器都必须在架构中具有唯一名称。不同模式中的触发器可以具有相同的名称。
可以为具有相同触发事件和动作时间的给定表格定义多个触发器。例如,你可以有两个在更新之前
触发桌子。默认情况下,具有相同触发事件和动作时间的触发器按其创建的顺序激活。要影响触发顺序,请在后面指定条款对于每一行
那表明换
或者前面
以及也具有相同触发事件和动作时间的现有触发器的名称。和换
,新触发器在现有触发后激活。和前面
,新触发器在现有触发前激活。
例如,以下触发定义定义了另一个在插入之前
触发器帐户
桌子:
MySQL>在每行插入帐户之前创建触发器INS_TRANSACTION之前的ins_sum set @deposits = @deposits + if(new.amount> 0,new.amount,0),@withdrawals = @withdrawals + if(new.amount <0,-New.Amount,0);查询OK,影响0行(0.01秒)
这个触发器,ins_transaction.
, 类似于ins_sum.
但分别累积存款和提取。它有一个前面
条件导致它以前激活ins_sum.
;没有那个条款,它会激活之后ins_sum.
因为它是在以后创造的ins_sum.
。
在触发器身上,老的
和新的
关键字使您可以访问受触发器影响的行中的列。老的
和新的
MySQL延伸是触发的;它们不区分大小写。
在A.插
触发器新的。
可以使用;没有旧行。在一个col_name.
删除
触发器老的。
可以使用;没有新的行。在A.col_name.
更新
触发器,您可以使用老的。
要在更新之前引用行的列和col_name.
新的。
要在更新后引用行的列。col_name.
列命名的列老的
只读。你可以参考它(如果你有选择
特权),但没有修改它。您可以引用名为的列新的
如果你有选择
它的特权。在一个前
触发器,您也可以使用它的值更改设置新的。
如果你有col_name.
=价值
更新
它的特权。这意味着您可以使用触发器修改要插入新行或用于更新行的值。(这样A.放
声明没有效果后
触发器因为已经发生了行更改。)
在一个前
触发器,这新的
价值自动递增
列为0,而不是当实际插入新行时自动生成的序列号。
通过使用开始......结束
构造,您可以定义执行多个语句的触发器。在这内开始
块,您还可以使用所存储的例程中允许的其他语法,例如条件和循环。但是,只要存储例程,如果使用mysql.定义执行多个语句的触发器的程序,必须重新定义mysql.语句分隔符以便您可以使用;
触发定义中的语句分隔符。以下示例说明了这些点。它定义了一个更新
触发器检查要用于更新每行的新值,并将值修改为0到100的范围内。这必须是a前
触发器因为必须在使用之前检查值来更新行:
mysql> delimiter // mysql>创建触发upd_check,然后在每行的帐户更新之前,如果new.aount <0开始,则设置new.amount = 0;elseff.amount> 100然后set new.amount = 100;万一;结束; // mysql>分隔符;
可以单独定义存储过程可以更容易,然后使用简单的方式将其从触发器调用称呼
陈述。如果您想在几个触发器中执行相同的代码,这也是有利的。
在激活时,触发器在语句中出现的局限存在局限性:
也可以看看第25.8节“限制存储计划”。
MySQL在触发器执行期间处理错误,如下所示:
如果一个
前
触发失败,未执行相应行的操作。一种
前
触发器被激活试图要插入或修改行,无论尝试随后是否成功。一个
后
仅在任何时候执行触发器前
触发器和行操作成功执行。一个错误
前
或者后
触发导致导致触发调用的整个语句失败。对于事务表,语句的失败应导致语句执行的所有更改的回滚。触发器的失败会导致语句失败,因此触发故障也会导致回滚。对于非讲台,不能完成这种回滚,因此虽然语句失败,但在误差点之前执行的任何更改都效果。
触发器可以按名称的表格包含直接引用,例如命名的触发器Testref.
如图所示:
创建表Test1(A1 int);创建表Test2(A2 int);创建表Test3(A3 int not null auto_increment主键);创建表test4(a4 int not null auto_increment主键,b4 int默认值0);界定钻机|在将测试1上插入测试1之前在Test2中创建触发器TestRef在Test2设置A2 = New.A1中;从test3中删除其中a3 = new.a1;更新Test4 Set B4 = B4 + 1其中A4 = New.A1;结尾;| delimiter ; INSERT INTO test3 (a3) VALUES (NULL), (NULL), (NULL), (NULL), (NULL), (NULL), (NULL), (NULL), (NULL), (NULL); INSERT INTO test4 (a4) VALUES (0), (0), (0), (0), (0), (0), (0), (0), (0), (0);
假设您将以下值插入表中test1.
如下所示:
MySQL>插入Test1值(1),(3),(1),(7),(1),(8),(4),(4);查询OK,8行受影响(0.01秒)记录:8重复项:0警告:0
因此,四个表包含以下数据:
mysql> select * from test1;+ ------ + |A1 |+ ------ + |1 ||3 ||1 || 7 | | 1 | | 8 | | 4 | | 4 | +------+ 8 rows in set (0.00 sec) mysql> SELECT * FROM test2; +------+ | a2 | +------+ | 1 | | 3 | | 1 | | 7 | | 1 | | 8 | | 4 | | 4 | +------+ 8 rows in set (0.00 sec) mysql> SELECT * FROM test3; +----+ | a3 | +----+ | 2 | | 5 | | 6 | | 9 | | 10 | +----+ 5 rows in set (0.00 sec) mysql> SELECT * FROM test4; +----+------+ | a4 | b4 | +----+------+ | 1 | 3 | | 2 | 0 | | 3 | 1 | | 4 | 2 | | 5 | 0 | | 6 | 0 | | 7 | 1 | | 8 | 1 | | 9 | 0 | | 10 | 0 | +----+------+ 10 rows in set (0.00 sec)