您的位置:首页 > 数据库 > MySQL

MySQL之InnoDB触发器

2017-11-30 15:00 204 查看
对触发器的支持,使的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,因为他们容易产生误差,numeric和decimal同义,numeric将自动转成decimal。

DECIMAL从MySQL 5.1引入,列的声明语法是DECIMAL(M,D)。在MySQL 5.1中,参量的取值范围如下:
M是数字的最大数(精度)。其范围为1~65(在较旧的MySQL版本中,允许的范围是1~254),M
的默认值是10。
D是小数点右侧数字的数目(标度)。其范围是0~30,但不得超过M。
说明:float占4个字节,double占8个字节,decimail(M,D)占M+2个字节。
如DECIMAL(5,2)
的最大值为9 9 9 9 . 9 9,因为有7
个字节可用。
本文主要参考了MySQL DBA 修炼之道一书中对触发器的介绍
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: