MySql cmd下的学习笔记 —— 有关修饰器的知识(trigger)

时间:2022-09-22 15:58:02

关于触发器的理解:

进行数据库应用软件的开发时,有时我们碰到表的某些数据的改变时,希望同时

引起其他相关数据改变的需求,利用触发器就能满足这样的需求。

触发器能在表中的某些特定数据变化时自动完成某些查询,运用触发器不仅仅可以

简化程序,而且可以增加程序的灵活性

触发器是一类特殊的事务:

可以监视某种数据的操作(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

MySql cmd下的学习笔记 —— 有关修饰器的知识(trigger)

MySql cmd下的学习笔记 —— 有关修饰器的知识(trigger)

当我买了2只猫后, 如果没学过触发器,应该把num的值减2;

MySql cmd下的学习笔记 —— 有关修饰器的知识(trigger)

而利用触发器,则会使步骤变得智能

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)

MySql cmd下的学习笔记 —— 有关修饰器的知识(trigger)

MySql cmd下的学习笔记 —— 有关修饰器的知识(trigger)

在这个例子中,在每在ord中添加一条记录后,goods表的cat行num都会减2;但无论你在ord表内添加任何信息,goods表的cat行num只会减2

  优化只能减cat的num-2的问题

触发器引用变量

我们下ord表中,插入的一行叫做new,删除一行叫做old MySql cmd下的学习笔记 —— 有关修饰器的知识(trigger)

如果直接添加会报如下的错误,因为在同一张表中还不支持建立相同触发条件的多个触发器

删除trigger

MySql cmd下的学习笔记 —— 有关修饰器的知识(trigger)

建立更“智能”的trigger

MySql cmd下的学习笔记 —— 有关修饰器的知识(trigger)

当建立好t2时,我们来测试一下

MySql cmd下的学习笔记 —— 有关修饰器的知识(trigger)

建立一个t3,实现退货系统(不会t2冲突吗)

MySql cmd下的学习笔记 —— 有关修饰器的知识(trigger)

MySql cmd下的学习笔记 —— 有关修饰器的知识(trigger)

修改订单数据

MySql cmd下的学习笔记 —— 有关修饰器的知识(trigger)

MySql cmd下的学习笔记 —— 有关修饰器的知识(trigger)

MySql cmd下的学习笔记 —— 有关修饰器的知识(trigger)

当要购买的数量大于库存数时,就会出现问题

MySql cmd下的学习笔记 —— 有关修饰器的知识(trigger)

说明必须在实现该条语句之前,就把数据改为 new.much = 最大的储存量;

MySql cmd下的学习笔记 —— 有关修饰器的知识(trigger)

MySql cmd下的学习笔记 —— 有关修饰器的知识(trigger)

MySql cmd下的学习笔记 —— 有关修饰器的知识(trigger)