深入领略MySQL触发器(2)

删除前: mysql> select * from goods; +-----+---------+-------------+---------+ | id | gname | description | storage | +-----+---------+-------------+---------+ | 1 | huawei | rongyao9 | 198 | | 2 | iphone | iphoneX | 100 | +-----+---------+-------------+---------+ 2 rows in set (0.00 sec) mysql> select * from shoppingcar; +------+------+--------+ | u_id | g_id | amount | +------+------+--------+ | 1 | 1 | 2 | +------+------+--------+ 1 rows in set (0.00 sec)

删除数据: mysql> delete from shoppingcar where g_id=1; Query OK, 1 row affected (0.03 sec)

功效:

深入明确MySQL触发器

3)更新数据(可增可减)

当用户对想通过修改购物车的数量来修改本身购置某种商品的数量,那么,我们的库存也需要随着窜改。

mysql> create trigger shop_good2 -> after update on shoppingcar -> for each row -> update goods set storage=storage-new.amount+old.amount where id=new.g_id/old.g_id; Query OK, 0 rows affected (0.14 sec)

深入明确MySQL触发器

查察触发器呼吁

show triggers

这个呼吁只能看到都有哪些的triggers,而看不到trigger的详细信息。

所有触发器信息都存储在information_schema数据库下的triggers表中,可以利用SELECT语句查询。假如有许多个触发器,最好通过TRIGGER_NAME字段指定查询某一个触发器。

譬喻:

SELECT * FROM information_schema.triggers WHERE TRIGGER_NAME='XXX';

(4)限制条件

条件限制对一些涉及到金额的场所(如开篇提到的)很是重要,在电商的限购数额中也会有应用。

trigger操作delimiter,begin和if语句块实现限制条件。

譬喻: mysql> delimiter // mysql> create trigger shop_limit before update on shoppingcar -> for each row -> begin -> if new.amount>3 then -> set new.amount=3; -> elseif new.amount<0 then -> set new.amount=0; -> end if; -> end; // mysql> delimiter ;

条件语句措施块用begin和end包裹起来实现

delimiter:切换竣事符,因为;是MySQL中默认的竣事符,假如措施块中呈现;标记,就会引起斗嘴。最后要将竣事符修改返来。留意delimiter与竣事符之间有空格,不然会无法切换。

更新数据前:

深入明确MySQL触发器

更新数据:

mysql> update shoppingcar set amount=4 where u_id=1; Query OK, 1 row affected (0.02 sec) Rows matched: 1 Changed: 1 Warnings: 0

更新数据后:

深入明确MySQL触发器

购置量无法高出3

关于触发器与事务

对付事务表(Innodb),before语句后头的判定语句失败将会导致回滚事件语句执行的所有变动。触发器失败会导致语句失败,因此触发器失败也会导致回滚。对付非事务性表(MyISAM),无法执行此类回滚,因此尽量语句失败,但在错误点之前执行的任何变动仍然有效。

关于触发器的利用限制

触发器执有一些限制:

1. 触发器不能利用CALL 语句来将数据返回给客户端或利用动态SQL的存储进程。但答允存储进程通过OUT或INOUT 参数将数据返回到触发器 。

2. 触发不能利用事务相关的语句,如 START TRANSACTION,COMMIT或ROLLBACK。因为触发器对update,delete,insert等事件做了处理惩罚,而且是凭据before,SQL语句,after的顺序来执行的,一旦某一步堕落,就会回滚数据。假如在触发器中利用事务,就会发生抵牾。

Linux公社的RSS地点https://www.linuxidc.com/rssFeed.aspx

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsdjjz.html