触发器是一种特殊的存储过程,它在插入,删除或修改特定表中的数据时触发执行,它比数据库本身标准的功能有更精细和更复杂的数据控制能力。说白了就是监视(增,删,改)某种情况并触发(增,删,改)某种操作。比如说在淘宝上买东西,顾客下了一个订单,即往订单表中插入了一条数据,那么在库存表中就会减少一条数据,这两个过程是一体的,这时候就比较适合用触发器来进行相关的操作。
1.触发器的四要素:
2.触发器的创建语法:
create trigger tirggerName
after/before(触发时间) insert/update/delete (监视事件) on 表名 (监视地址)
For each row #这句话是固定的
Begin
Sql语句 #一句或多句,insert/update/delete范围内
End;
3.触发器中引用行的值
对于insert而言,新增的行用new来表示,行中的每一列的值,用new.列名来表示
对于delete来说,原本有一行,后来被删除,想引用被删除的这一行,用old,来表示old.列名,就可以引用被删除行中的值
对于update来说,被修改的行,修改前的数据,用old来表示,old.列名引用被修改之前行中的值修改后的数据,用new来表示,new.列名引用被修改之后行中的值
4.实例:建立商品表和订单表,并插入相关数据

1 #建立商品表 2 Create table goods( 3 Id int, 4 Name varchar(10), 5 Num int 6 )charset utf8; 7 #建立订单表 8 Create table order( 9 Oid int, 10 Gid int, 11 Much int, 12 )charset utf8; 13 14 Insert into goods 15 Values 16 (1,'猪',22), 17 (2,'羊',19), 18 (3,'狗',12), 19 (4,'猫',8);
①添加订单,库存减少
a.先创建触发器:
DELIMITER $$(必须加上,否则创建不成功)
CREATE TRIGGER tg1
AFTER INSERT ON order1
FOR EACH ROW
BEGIN
UPDATE goods SET num=num-new.much WHERE id=new.gid;
END;
$$
b.向order1表中插入一条数据:INSERT INTO order1 VALUES(1,3,50);
c.查看订单表和商品表,结果是一致的,说明触发器应用是成功的。
2.删除订单,库存增加

1 #删除订单,库存增加 2 DELIMITER $$ 3 CREATE TRIGGER tg2 4 AFTER DELETE ON order1 5 FOR EACH ROW 6 BEGIN 7 UPDATE goods SET num=num+old.much WHERE id=old.gid; 8 END; 9 $$ 10 #删除订单表中的添加的数据 11 DELETE FROM order1 WHERE oid=1; 12 #显示商品表中的数据 13 SELECT * FROM goods;
3.修改订单的数量时,库存相应改变

1 #修改订单的数量时,库存相应改变 2 DELIMITER $$ 3 CREATE TRIGGER tg3 4 AFTER UPDATE ON order1 5 FOR EACH ROW 6 BEGIN 7 UPDATE goods SET num=num+old.much-new.much WHERE id=old.gid; 8 END; 9 $$ 10 #修改订单 11 UPDATE order1 SET much = 5 WHERE oid =1; 12 #显示商品表中的数据 13 SELECT * FROM goods;