12 _ MySQL触发器
触发器(trigger)是一个特殊的存储过程,不同的是,执行存储过程要使用CALL语句来调用,而触发器的执行不需要使用CALL语句来调用,也不需要手工启动,只要当一个预定义的事件发生的时候,就会被MySQL自动调用。
触发器可以查询其他表,而且可以包含复杂的SQL语句。它们主要用于满足复杂的业务规则或要求。例如,可以根据客户当前的账户状态控制是否允许插入新订单。本节将介绍如何创建触发器。
01 _ 创建触发器
CREATE TRIGGER `trigger_name` `trigger_time` `trigger_event`
ON `tbl_name` FOR EACH ROW `trigger_stmt`
------------------------------------------------------
`trigger_name` -- 表示触发器名称,用户自行指定
`trigger_time` -- 表示触发时机,可以指定为before或after
`trigger_event` -- 表示触发事件,包括INSERT、UPDATE和DELETE
`tbl_name` -- 表示建立触发器的表名,即在哪张表上建立触发器
`trigger_stmt` -- 是触发器执行语句,可以是一条语句。
-- 也可以用BEGIN和END作为开始和结束,中间包含多条语句。
创建一个单执行语句的触发器
- 创建一个account表,表中有两个字段,分别为acct_num字段(定义为int类型)和amount字段(定义成浮点类型)
CREATE TABLE account (acct_num INT, amount DECIMAL(10,2));
- 创建一个名为ins_sum的触发器,触发的条件是向数据表account插入数据之前,对新插入的amount字段值进行求和计算。
Create Trigger ins_sum Before Insert
On myaccount For Each Row Set @sum = @sum + NEW.amount;
- 插入数据,测试。
mysql> Set @sum = 0;
Query OK, 0 rows affected (0.00 sec)
mysql> Insert Into account values(1,1.00),(2,2.00);
Query OK, 2 rows affected (0.01 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> Select @sum;
+------+
| @sum |
+------+
| 3.00 |
+------+
1 row in set (0.00 sec)
mysql>
创建有多个执行语句的触发器
- 创建几个表
Create Table test1(a1 Int);
Create Table test2(a2 Int);
Create Table test3(a3 Int Not Null Auto_Increment Primary Key);
Create Table test4(
a4 Int Not Null Auto_Increment Primary Key,
b4 Int Default 0
);
- 创建存储过程
Delimiter //
Create Trigger testref Before Insert On test1 For Each Row
Begin
Insert Into test2 Set a2 = NEW.a1;
Delete From test3 Where a3 = NEW.a1;