深入领略MySQL触发器

触发器(trigger)是数据库中的一个很重要的、很实用的基于事件的处理惩罚器,在处理惩罚一些业务需求的时候,利用触发器会很利便。好像在《高机能MySQL》中,对触发器作了必然的描写,也提到利用中的一些优势和范围性,但感受照旧不能完全领略触发器的全部成果和实现。于是本身在网上看了一些文章,团结官网(https://dev.mysql.com/doc/refman/8.0/en/trigger-syntax.html)中的案例,写下这篇总结。

根基领略:

1. 利用场所:

触发器是基于事件的,主要的事件也就是MySQL的增删改操纵,即insert,delete,update。

2. 触发器的定名

Trigger names exist in the schema namespace, meaning that all triggers must have unique names within a schema. Triggers in different schemas can have the same name.

因为触发器在单表的定名空间内,所以同一个表的触发器名称需要差异。差异表可以有沟通的触发器名称。

3. 触发器执行顺序

假如有沟通的update(可能delete,insert)触发器,就会凭据建设的时间来执行。

而FOLLOWS 和 PRECEDES 可以修改trigger的执行顺序

譬喻官方的案例:

mysql> CREATE TRIGGER ins_transaction BEFORE INSERT ON account

FOR EACH ROW PRECEDES ins_sum

SET

@deposits = @deposits + IF(NEW.amount>0,NEW.amount,0),

@withdrawals = @withdrawals + IF(NEW.amount<0,-NEW.amount,0);

Query OK, 0 rows affected (0.01 sec)

ins_transaction和ins_sum别离是两个触发器的名称。

4. 触发器的浸染

1. 安详性。可以基于数据库的值利用户具有操纵数据库的某种权利。

1)可以基于时间限制用户的操纵,譬喻不答允下班后和节沐日修改数据库数据。

2)可以基于数据库中的数据限制用户的操纵,譬喻不答允单个商品的购置量大于一个牢靠值。

2. 审计。可以跟踪用户对数据库的操纵。 

1)审计用户操纵数据库的语句。

2)把用户对数据库的更新写入审计表。

这一块因为本人没有用过,就不赘述了,今后有时机来增补

3. 实现巨大的数据完整性法则

实现非尺度的数据完整性查抄和约束。触发器可发生比法则更为巨大的限制。与法则差异,触发器可以引用列或数据库工具。譬喻,触发器可回退任何诡计吃进高出本身担保金的期货。

4. 实现巨大的非尺度的数据库相关完整性法则。

1)触发器可以对数据库中相关的表举办连环更新。这是用得较量多的一种实现成果。

2) 触发器可以或许拒绝或回退那些粉碎相关完整性的变革,打消试图举办数据更新的事务。当插入一个与其主健不匹配的外部键时,这种触发器会起浸染。

下面的例子我会较量具体的描写这两个特性。

5. 同步及时地复制表中的数据。

6. 自动计较数据值,假如数据的值到达了必然的要求,则举办特定的处理惩罚。

譬喻,假如公司的帐号上的资金低于5万元则当即给财政人员发送告诫数据。

1)插入数据:

当用户添加一个订单的时候,我们需要对商品表格中的库存(storage)举办相应的窜改

mysql> create trigger shop_goods -> after insert on shoppingcar -> for each row -> update goods set storage=storage-new.amount where id=new.g_id -> ; Query OK, 0 rows affected (0.03 sec) mysql>insert into shoppingcar values(1,1,2);

查询功效:

goods表 +-------+---------+-------------+---------+ | id | gname | description | storage | +-------+---------+---------- --+---------+ | 1 | huawei | rongyao9 | 198 | | 2 | iphone | iphoneX | 100 | +-------+---------+-------------+---------+ shoppingcar表 +----- -+----- -+--------+ | u_id | g_id | amount | +-------+-------+--------+ | 1 | 1 | 2 | +-------+-------+--------+

关于newold的利用

new暗示新的数据行,而old暗示旧的数据行

2)删除数据

譬喻,用户取消一个订单的时候,我们需要将商品的数量加归去

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

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

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