触发器
1.通过示例了解触发器
示例1:
CREATE TABLE account (acct_num INT, amount DECIMAL(10,2));
DELIMITER KaTeX parse error: Expected 'EOF', got '#' at position 52: …T ON account #̲#建立触发器ins_sum,O…
DELIMITER ;
mysql> SET @sum = 0;
Query OK, 0 rows affected (0.00 sec)
mysql>
mysql> INSERT INTO account VALUES(137,14.98),(141,1937.50),(97,-100.00); ##插入三行数据,触发器被触发了三次
Query OK, 3 rows affected (0.03 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql>
mysql> SELECT @sum AS ‘Total amount inserted’; ##新插入的行中的amount列会相加
±----------------------+
| Total amount inserted |
±----------------------+
| 1852.48 |
±----------------------+
补充:insert into account select * from account_bak; ##导入多少行数据,触发器就会被触发多少次
2.触发器的构成部分
(1)begin end语句体
(2)什么条件触发 (有insert,delete,update)
(3)什么时候触发(before或者after insert,delete,update)
(4)触发频率(针对每一行数据触发一次)
(5)触发器定义在表上,附着在表上
语法:
CREATE
[DEFINER = { user | CURRENT_USER }]
TRIGGER trigger_name ##trigger_name是触发器的名字
trigger_time trigger_event
ON tbl_name FOR EACH ROW
[trigger_order]
trigger_body
trigger_time: { BEFORE | AFTER } ##触发时间
trigger_event: { INSERT | UPDATE | DELETE } ##触发条件
trigger_order: { FOLLOWS | PRECEDES } other_trigger_name ##指定在哪个触发器之前之
后执行,5.7版本以后才有的语法结构,可以定义多个触发器,不局限于原来的6个
3.对于触发器的要求
begin end之间的语句的执行效率一定要很高,并且对于资源的消耗很小
4.触发器中的old和new
定义一个触发器,
CREATE TRIGGER chufa before update on stu FOR EACH ROW
对于stu表,在更新之前叫做old;更新之后叫做new
old和new的特点:
(1)对于insert来说只有new;对于delete来说只有old,update有old和new
(2)代表的是一行
(3)出现在触发器中
new示例:
delimiter KaTeX parse error: Expected 'EOF', got '#' at position 133: …nt = 0; #̲#新插入的行中的amount列…
delimiter ;
old示例:
create table account_bak as select * from account where 1=2; ##新建表,两个表的结构一样
delimiter KaTeX parse error: Expected 'EOF', got '#' at position 58: … ON account #̲#触发器触发条件:更新表之前 …
delimiter ;
mysql> select * from account;
±---------±--------+
| acct_num | amount |
±---------±--------+
| 137 | 100.00 |
| 141 | 1937.50 |
| 97 | -100.00 |
±---------±--------+
3 rows in set (0.00 sec)
mysql> select * from account_bak;
Empty set (0.00 sec)
mysql> update account set amount=200 where acct_num=141;
Query OK, 1 row affected (0.34 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from account_bak;
±---------±--------+
| acct_num | amount |
±---------±--------+
| 141 | 1937.50 |
±---------±--------+
1 row in set (0.00 sec)
5.对于触发器的要求
(1)尽量少的使用,对于时常需要增删改的表,不要使用触发器
(2)需要使用时,一定要谨慎,执行效率一定要非常高