相关文件10bet官方网站 下载本手册 从本手册中摘录

25.3.1触发语法和示例

要创建触发器或删除触发器,请使用创建触发器或者删除触发器声明,描述于第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.与之相关联帐户桌子。它还包括指定触发动作时间,触发事件以及在触发激活时执行的条款:

  • 关键词表示触发动作时间。在这种情况下,触发器在插入表中的每一行之前激活。这里的另一个允许的关键字是

  • 关键词表示触发事件;也就是说,激活触发器的操作类型。在该示例中,操作原因触发激活。您还可以创建触发器删除更新操作。

  • 声明后面对于每一行定义触发器身体;也就是说,每次执行触发器激活的语句,它发生了一次,每个行受触发事件影响的每行。在该示例中,触发器体是一个简单的累积到用户变量中插入到的值数量柱子。该陈述指的是列emount.amount.意思是价值数量要插入新行的列。

要使用触发器,将累加器变量设置为零,执行一个语句,然后看看变量后面的值:

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.可以使用;没有旧行。在一个删除触发器老的。col_name.可以使用;没有新的行。在A.更新触发器,您可以使用老的。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>分隔符;

可以单独定义存储过程可以更容易,然后使用简单的方式将其从触发器调用称呼陈述。如果您想在几个触发器中执行相同的代码,这也是有利的。

在激活时,触发器在语句中出现的局限存在局限性:

  • 触发器不能使用称呼调用将存储程序返回给客户端或使用动态SQL的存储过程。(允许存储的程序返回触发器的数据出去或者进出参数。)

  • 触发器无法使用明确或隐式开始或结束事务的语句,例如开始交易犯罪, 或者回滚。(回滚到保存点被允许,因为它没有结束交易。)。

也可以看看第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)