Innodb 存储引擎 学习笔记 -触发器

触发器作用:在执行INSERT、DELETE、UPDATE命令转换 自动调用SQL命令存储过程

触发器也是实现约束的一种方法!

创建一张用户消费表,每次用户购买一样物品后其金额都是递减的,若此时有“不怀好意”的用户做了一个减去负数的操作,这样金额就会增加,从逻辑业务来说,这一定是错的所以我们在这里设置一个触发器,当用户执行了减去负数的操作时记录下来,在表usercash_err_log中。

mysql> create table uesrcash(
    -> userid int not null,
    -> cash int unsigned not null);
Query OK, 0 rows affected (0.10 sec)

mysql> insert into usercash select 1,1000;
Query OK, 1 row affected (0.01 sec)

 

mysql> update usercash
    -> set cash =cash -(-20)
    -> where userid =1;
Query OK, 1 row affected (0.09 sec)

创建错误操作表

mysql> create table usercash_error_log(
    -> userid int not null,
    -> old_cash int unsigned not null,
    -> new_cash int unsigned not null,
    -> user varchar(30),
    -> time DATETIME);
Query OK, 0 rows affected (0.13 sec)

 创建触发器:

mysql> delimiter $$
mysql>  create trigger tgr_usercash_update before update on usercash
    ->     for each row
    ->     begin
    ->     if new.cash - old.cash >0 then
    ->     insert into usercash_error_log
    ->     select old.userid,old.cash,new.cash,USER(),NOW();
    ->     set new.cash = old.cash;
    ->     end if;
    ->     end;
    ->    $$

现在,我们再次试着让cash = cash - (-20)

mysql> UPDATE usercash
    -> set cash = cash-(-20);
Query OK, 0 rows affected (0.11 sec)
Rows matched: 2  Changed: 0  Warnings: 0


mysql> UPDATE usercash
    -> set cash = cash-(-20)
    -> where userid =2;

mysql> select * from usercash;
+--------+------+
| userid | cash |
+--------+------+
|      1 | 1020 |
|      2 | 1000 |
+--------+------+

mysql> select * from usercash_error_log;
+--------+----------+----------+----------------+---------------------+
| userid | old_cash | new_cash | user           | time                |
+--------+----------+----------+----------------+---------------------+
|      1 |     1020 |     1040 | root@localhost | 2019-03-21 13:54:42 |
|      2 |     1000 |     1020 | root@localhost | 2019-03-21 13:54:42 |
|      2 |     1000 |     1020 | root@localhost | 2019-03-21 13:55:39 |
+--------+----------+----------+----------------+---------------------+
3 rows in set (0.00 sec)

可以看到,cash值并没有改变

错误操作都被记录到 usercash_error_log 里了。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值