北京网站建设推广,鄂州手机网站设计,最新汽车网站大全,开源crm系统【图书推荐】《MySQL 9从入门到性能优化#xff08;视频教学版#xff09;》-CSDN博客
《MySQL 9从入门到性能优化#xff08;视频教学版#xff09;#xff08;数据库技术丛书#xff09;》(王英英)【摘要 书评 试读】- 京东图书 (jd.com)
MySQL9数据库技术_夏天又到了…【图书推荐】《MySQL 9从入门到性能优化视频教学版》-CSDN博客
《MySQL 9从入门到性能优化视频教学版数据库技术丛书》(王英英)【摘要 书评 试读】- 京东图书 (jd.com)
MySQL9数据库技术_夏天又到了的博客-CSDN博客
触发器是一个特殊的存储过程它与普通的存储过程不同的是存储过程的执行要使用CALL语句来调用而触发器的执行不需要使用CALL语句来调用也不需要手工启动只要当一个预定义的事件发生的时候就会被MySQL自动调用。例如当对表fruits进行操作INSERT、DELETE或UPDATE时就会激活它触发器。
触发器不仅可以查询其他表而且可以包含复杂的SQL语句。它们主要用于满足复杂的业务规则或要求。例如可以根据客户当前的账户状态控制是否允许插入新订单。本节将介绍如何创建触发器。
10.1.1 创建只有一个执行语句的触发器
创建只有一个执行语句的触发器的语法如下
CREATE TRIGGER trigger_name trigger_time trigger_eventON tbl_name FOR EACH ROW trigger_stmt
其中trigger_name表示触发器名称用户自行指定trigger_time表示触发时机可以指定为before或aftertrigger_event表示触发事件包括INSERT、UPDATE和DELETEtbl_name表示建立触发器的表名即在哪张表上建立触发器trigger_stmt是触发器的执行语句。
【例10.1】创建一个单执行语句的触发器SQL语句如下
mysql CREATE TABLE account (acct_num INT, amount DECIMAL(10,2));mysql CREATE TRIGGER ins_sum BEFORE INSERT ON account FOR EACH ROW SET sum sum NEW.amount;mysqlSET sum 0;mysql INSERT INTO account VALUES(1,1.00), (2,2.00);mysql SELECT sum;
------
| sum |
------
| 3.00 |
------对于上述语句首先创建一张表account表中有两个字段分别为acct_num定义为INT类型和amount定义成浮点类型其次创建一个名为ins_sum的触发器触发的条件是向数据表account插入数据之前对新插入的amount字段值进行求和计算。
10.1.2 创建有多个执行语句的触发器
创建有多个执行语句的触发器的语法如下
CREATE TRIGGER trigger_name trigger_time trigger_eventON tbl_name FOR EACH ROWBEGIN语句执行列表END
其中trigger_name表示触发器的名称用户自行指定trigger_time表示触发时机可以指定为before或aftertrigger_event表示触发事件包括INSERT、UPDATE和DELETEtbl_name表示建立触发器的表名即在哪张表上建立触发器触发器程序可以使用BEGIN和END作为开始和结束中间包含多条语句。
【例10.2】创建一个包含多个执行语句的触发器SQL语句如下
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 test1FOR EACH ROW
BEGININSERT INTO test2 SET a2 NEW.a1;DELETE FROM test3 WHERE a3 NEW.a1; UPDATE test4 SET b4 b4 1 WHERE a4 NEW.a1;END
//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);上面的代码创建了一个名为“testref”的触发器。这个触发器的触发条件是在向表test1插入数据前执行触发器的语句具体执行的代码如下
mysql INSERT INTO test1 VALUES (1), (3), (1), (7), (1), (8), (4), (4);
4张表中的数据如下
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)执行结果显示在向表test1插入记录的时候表test2、表test3、表test4都发生了变化。从这个例子中可以看到表test1中的INSERT操作触发了触发器向表test2中插入了表test1中的值删除了表test3中相同的内容同时更新了表test4中的b4即与插入的值相同的个数。