MySQL触发器的使用

触发器

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)需要使用时,一定要谨慎,执行效率一定要非常高

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值