关于触发器的理解:
进行数据库应用软件的开发时,有时我们碰到表的某些数据的改变时,希望同时
引起其他相关数据改变的需求,利用触发器就能满足这样的需求。
触发器能在表中的某些特定数据变化时自动完成某些查询,运用触发器不仅仅可以
简化程序,而且可以增加程序的灵活性
触发器是一类特殊的事务:
可以监视某种数据的操作(insert/update/delete)
并触发相关的操作(insert/update/delete)
需求:
商品表:goods
订单表:ord
当下一个订单时,对应的商品要相应减少(买几个商品就少几个库存)
分析:
监视谁:ord
监视动作:insert
触犯时间:after
触发时间:update
mysql> create table goods( -> gid int, -> name varchar(20), -> num smallint-> )engine myisam charset utf8; Query OK, 0 rows affected (0.07 sec) mysql> create table ord( -> ord int, -> gid int, -> much smallint -> )engine myisam charset utf8; Query OK, 0 rows affected (0.07 sec)
mysql> insert into goods
-> values
-> (1, 'cat', 14),
-> (2, 'dog', 65),
-> (3, 'horse', 21);
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
当我买了2只猫后, 如果没学过触发器,应该把num的值减2;
而利用触发器,则会使步骤变得智能
mysql> delimiter $ # ‘$’分割符是为了与‘;’做出区别
mysql> create trigger t1 #创建一个触发器
-> after # 在insert后触发
-> insert # 触发条件
-> on ord # 在哪个表建立触发条件
-> for each row
-> begin # 开始
-> update goods set num = num - 2 where gid = 1; # 触发后改变的
-> end$ # 结束
Query OK, 0 rows affected (0.13 sec)
在这个例子中,在每在ord中添加一条记录后,goods表的cat行num都会减2;但无论你在ord表内添加任何信息,goods表的cat行num只会减2
优化只能减cat的num-2的问题
触发器引用变量
我们下ord表中,插入的一行叫做new,删除一行叫做old
如果直接添加会报如下的错误,因为在同一张表中还不支持建立相同触发条件的多个触发器
删除trigger
建立更“智能”的trigger
当建立好t2时,我们来测试一下
建立一个t3,实现退货系统(不会t2冲突吗)
修改订单数据
当要购买的数量大于库存数时,就会出现问题
说明必须在实现该条语句之前,就把数据改为 new.much = 最大的储存量;