要创建一个触发器或删除触发器,使用创建触发器
或下降触发
声明中描述的部分13.1.20,“创建触发器语句”,部分13.1.31”,删除触发器语句“。
这是一个简单的例子,将触发器与一个表,来激活插入
操作。触发器作为蓄电池,求和的值插入到表列之一。
mysql >创建表帐户(acct_num INT,小数(10,2));查询好,0行影响(0.03秒)mysql >为每一行创建触发器在插入之前ins_sum帐户设置@sum = @sum + NEW.amount;查询好,0行影响(0.01秒)
的创建触发器
声明命名创建一个触发器ins_sum
这是相关的账户
表。它还包括条款指定触发器动作时间,触发事件,当触发激活:
使用触发器,将蓄电池变量设置为零,执行插入
声明,然后看看值变量之后:
mysql >设置@sum = 0;mysql >插入帐户值(137,14.98),(1937.50 141),(97,-100.00);mysql >选择@sum作为“插入总量”;+ - - - - - - - - - - - - - - - - - - - - - - - -总额+ | | +插入- - - - - - - - - - - - - - - - - - - - - - - - + | 1852.48 | + - - - - - - - - - - - - - - - - - - - - - - - - +
在这种情况下,价值的@sum
后插入
语句执行14.98 + 1937.50 - 100
,或1852.48
。
摧毁触发器,使用下降触发
声明。你必须指定模式名如果触发器并不在默认模式:
mysql >触发test.ins_sum下降;
如果你把一个表,任何触发器表也下降了。
触发模式名称空间中的名称存在,这意味着一个模式中的所有触发器必须具有惟一的名称。触发器在不同模式可以有相同的名字。
MySQL 5.7.2,可以定义多个触发器对于一个给定的表有相同的触发事件和动作时间。例如,你可以有两个在更新之前
表的触发器。默认情况下,相同的触发,触发事件和动作时间激活的顺序与它们的创建。影响触发命令,指定一个条款为每一行
表明遵循
或之前
和现有的触发器的名称也有相同的触发事件和动作时间。与遵循
现有的触发后,新的触发。与之前
之前,新触发激活现有的触发器。
例如,下面的触发器定义定义了另一个之前插入
引发了账户
表:
mysql >为每一行创建触发器在插入之前ins_transaction帐户之前ins_sum @deposits = @deposits +如果(NEW.amount NEW.amount > 0, 0), @withdrawals = @withdrawals +如果(NEW.amount < 0 -NEW.amount 0);查询好,0行影响(0.01秒)
这个触发器,ins_transaction
,类似于ins_sum
但分别积累存款和取款。它有一个之前
条款,使其激活ins_sum
;没有这个条款,它会激活后ins_sum
因为它是后创建的ins_sum
。
MySQL 5.7.2之前,不能有多个触发器对于一个给定的表有相同的触发事件和动作时间。例如,你不能有两个在更新之前
表的触发器。为了解决这一问题,您可以定义一个触发执行多个语句的使用开始……结束
复合语句构造后为每一行
。(一个例子出现在本节)。
在触发器的身体,老
和新
关键词让你访问行中的列受到一个触发器。老
和新
MySQL扩展触发;他们不区分大小写的。
在一个插入
触发,只新的。
可以使用;没有旧的行。在一个col_name
删除
触发,只老了。
可以使用;没有新行。在一个col_name
更新
触发,你可以使用老了。
指前一行的列和更新col_name
新的。
引用的列行后更新。col_name
一个列命名老
是只读的。你可以参考它(如果你有选择
特权),但不能修改它。您可以参考列命名新
如果你有选择
特权。在一个之前
触发,你也可以改变它的值新设置。
如果你有col_name
=价值
更新
特权。这意味着您可以使用触发器来修改的值插入一个新行或用于更新一行。(这样一个集
在一个声明中没有影响后
触发,因为行修改已经发生)。
在一个之前
触发,新
价值的AUTO_INCREMENT
列是0,而不是序列号时自动生成新行插入。
通过使用开始……结束
构造,您可以定义一个触发执行多条语句。在开始
块,你也可以使用其他语法,允许在存储程序如条件语句和循环。然而,正如存储程序,如果你使用mysql程序定义触发器执行的多条语句,它重新定义是必要的mysql语句分隔符,这样您就可以使用;
在触发器定义语句分隔符。下面的例子说明了这些点。它定义了一个更新
触发,检查新值用于更新每一行,并修改值从0到100的范围内。这一定是一个之前
触发,因为价值在使用前必须检查更新的行:
mysql >分隔符/ / mysql >为每一行创建之前触发upd_check更新帐户如果新开始。< 0然后设置新的数量。数量= 0;ELSEIF新的。量> 100 THEN SET NEW.amount = 100; END IF; END;// mysql> delimiter ;
它可以更容易单独定义一个存储过程,然后从触发器调用它使用一个简单的调用
声明。这也是有利的,如果你想执行相同的代码在几个触发器。
有限制时可以出现在语句触发器执行激活:
另请参阅23.8节,“存储程序”限制。
MySQL触发执行过程中处理错误如下:
如果一个
之前
触发失败,行不执行对应的操作。一个
之前
触发器被激活的尝试插入或修改的行,不管后来成功的尝试。一个
后
只有任何触发执行之前
触发器和连续操作执行成功。在一个一个错误
之前
或后
触发导致失败的整个语句触发器调用引起的。对于事务性表,所有更改的声明应该引起回滚失败执行的语句。触发器语句失败原因的失败,所以触发失败也会造成回滚。回滚等nontransactional表,不能完成,所以虽然语句失败,执行任何更改之前的错误仍然有效。
触发器可以包含直接引用表的名字,比如触发器命名testref
这个例子所示:
创建表test1 (a1 INT);创建表test2 (a2 INT);创建表test3 (a3 INT NOT NULL AUTO_INCREMENT主键);创建表test4 (a4 INT NOT NULL AUTO_INCREMENT主键,b4 INT默认0);分隔符|创建触发器testref test1为每一行上插入开始之前插入test2设置a2 = NEW.a1;删除从test3 a3 = NEW.a1;更新test4设置b4 = b4 + 1, a4 = NEW.a1;结束;|分隔符;插入test3 (a3)值(空),(零),(零),(零),(零),(零),(零),(零),(零),(零); 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);查询好,8行影响(0.01秒)记录:8副本:0警告:0
结果,四个表包含以下数据:
从test1 mysql > SELECT *;a1 +——+ | | +——+ | 1 | | 3 | | 1 | | 7 | | 1 | | 8 | | 4 | | 4 | +——+ 8行设置mysql > SELECT * FROM test2(0.00秒);a2 +——+ | | +——+ | 1 | | 3 | | 1 | | 7 | | 1 | | 8 | | 4 | | 4 | +——+ 8行组(0.00秒)从test3 mysql > SELECT *;+ - - - + | a3 | +——+ | 2 | | 5 | | 6 | | 9 | | | 10 +——+ 5行组(0.00秒)从test4 mysql > SELECT *;+ - - - + - - - + | a4 | b4 | +——+——+ | 1 | 3 | | 2 | 0 | | 3 | 1 | | 4 | 2 | | 5 | 0 | | 6 | 0 | | 7 | 1 | | 8 | 1 | | 9 | 0 | | 10 | 0 | +——+——+ 10行组(0.00秒)