相关的文档10bet官方网站 本手册下载
PDF (Ltr)- 36.3 mb
PDF (A4)- 36.3 mb
手册页(TGZ)- 235.4 kb
手册页(邮政编码)- 347.1 kb
信息(Gzip)- 3.3 mb
信息(邮政编码)- 3.3 mb
本手册摘录

23.3.1触发语法和例子

要创建一个触发器或删除触发器,使用创建触发器下降触发声明中描述的部分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这是相关的账户表。它还包括条款指定触发器动作时间,触发事件,当触发激活:

  • 关键字之前表明触发器动作时间。在这种情况下,触发激活之前每一行插入到表中。这里允许的其他关键字

  • 关键字插入显示触发事件;也就是说,操作,激活触发器的类型。在这个例子中,插入操作原因引发激活。您还可以创建触发器删除更新操作。

  • 后的语句为每一行定义了触发器的身体;即语句执行每次触发,每一行都发生一次触发事件的影响。在这个例子中,触发器的身体是一个简单的积累到一个用户变量的值插入到列。声明指的列NEW.amount这意味着的值列插入新行。

使用触发器,将蓄电池变量设置为零,执行插入声明,然后看看值变量之后:

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 ;

它可以更容易单独定义一个存储过程,然后从触发器调用它使用一个简单的调用声明。这也是有利的,如果你想执行相同的代码在几个触发器。

有限制时可以出现在语句触发器执行激活:

  • 触发器不能使用调用语句来调用存储过程数据返回给客户端,或者使用动态SQL。(存储过程可以返回数据触发INOUT参数)。

  • 触发器不能使用语句显式或隐式地开始或结束一个事务,如开始事务,提交,或回滚。(保存点回滚是允许的,因为它没有结束一个事务)。

另请参阅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秒)