MySQL之InnoDB触发器

对触发器的支持,使的InnoDB也具有了商业数据库的功能

下面给出一个简单的事例,该例针对insert语句,将触发器和表关联起来。其作用相当于累加器,能够将插入表中一列的值累加起来。

1.建一张表

mysql> create table account (acct_num int,amount decimal(10,2));
Query OK, 0 rows affected (0.03 sec)
2.为该表创建一个触发器

mysql> create trigger ins_sum before insert on account for each row set @sum=@sum+new.amount;
Query OK, 0 rows affected (0.02 sec)
create triggery语句创建了与账户表相关的,名为ins_sum的触发程序。

它还包括一些子句,这些子句指定了触发程序激活的时间、触发程序时间、以及触发程序时要做什么。

关键字before指明了触发程序的动作时间。在本例中,将在每一行插入表之前激活触发程序。

如果需要在事件发生后激活触发程序,则需要指定关键字after。

关键字insert指明了激活触发程序的事件。本例中,insert语句将导致触发程序的激活。同样也可以为delete和update语句创建触发程序。

on account 为哪一张表,跟在for each row 后面的语句定义了每次激活程序时将要执行的程序,对于受触发语句影响的每一行执行一次。

本例中,触发的语句是简单的set语句,负责将插入amount列的值累加起来。该语句将列引用为new.amount,意思是“将要插入到新行的amount列的值”。

要想使用触发程序,将累加器变量设置为0,执行insert语句,然后查看变量的值,语句如下。

mysql> set @sum=0;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into account values(137,14.98),(141,1937.50),(97,-100.00);
Query OK, 3 rows affected (0.02 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> select @sum as 'total amount inserted';
+-----------------------+
| total amount inserted |
+-----------------------+
|               1852.48 |
+-----------------------+
1 row in set (0.00 sec)
3.想要销毁触发程序,可使用drop trigger语句

mysql> drop trigger test.ins_sum;
Query OK, 0 rows affected (0.00 sec)


注1:decimal

首先,对于精度比较高的东西,比如money,我会用decimal类型,不会考虑float,double,因为他们容易产生误差,numericdecimal同义,numeric将自动转成decimal

DECIMALMySQL 5.1引入,列的声明语法是DECIMAL(M,D)。在MySQL 5.1中,参量的取值范围如下:

M是数字的最大数(精度)。其范围为165(在较旧的MySQL版本中,允许的范围是1254),M 默认值是10

D是小数点右侧数字的数目(标度)。其范围是030,但不得超过M

说明float4个字节,double8个字节,decimail(M,D)M+2个字节

DECIMAL(5,2) 的最大值为9 9 9 9 . 9 9,因为有7 个字节可用。

本文主要参考了MySQL DBA 修炼之道一书中对触发器的介绍

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值