MySQL触发器
触发器: 是由MySQL的基本命令事件来触发的某种特定操作。
创建只有一个执行语句的触发器:
Usage:
CREATE TRIGGER 触发器名 BEFORE | AFTER 触发事件 ON 表名 FOR EACH ROW 执行语句
#EACH ROW:遍历每一行
#触发事件:insert/update/delete
示例:表studentinfo在插入数据前会触发动作:同时向timelog表插入一条数据
delimiter //
create trigger auto_save_time before insert
on studentinfo for each row
insert into timelog(savetime) values(now());
//
创建具有多个执行语句的触发器
Usage:
CREATE TRIGGER 触发器名称 BEFORE | AFTER 触发事件
ON 表名 FOR EACH ROW
BEGIN
执行语句列表
END
;
示例:删除记录,触发两条插入动作
delimiter //
create trigger delete_time_info after delete
on studentinfo for each row
begin
insert into timelog(savetime) values (now());
insert into timeinfo(info) values ('deleteact');
end
//
查看触发器
1.SHOW TRIGGERS\G
2.查看 triggers表中触发器信息
SELECT * FROM information_schema.triggers\G
使用触发器
触发器的执行顺序
BEFORE:表操作之前
AFTER:表操作之后
使用触发器维护冗余数据
补充:mysql 触发器OLD和NEW关键字
使用OLD和NEW关键字,能够访问受触发程序影响的行中的列(OLD和NEW不区分大小写)。在INSERT触发程序中,仅能使用NEW.col_name,没有旧行。在DELETE触发程序中,仅能使用OLD.col_name,没有新行。在UPDATE触发程序中,可以使用OLD.col_name来引用更新前的某一行的列,也能使用NEW.col_name来引用更新后的行中的列。
用OLD命名的列是只读的。你可以引用它,但不能更改它。对于用NEW命名的列,如果具有SELECT权限,可引用它。在BEFORE触发程序中,如果你具有UPDATE权限,可使用“SET NEW.col_name = value”更改它的值。这意味着,你可以使用触发程序来更改将要插入到新行中的值,或用于更新行的值。
在BEFORE触发程序中,AUTO_INCREMENT列的NEW值为0,不是实际插入新记录时将自动生成的序列号。
OLD和NEW是对触发程序的MySQL扩展。
示例:创建一个触发器,每当商品被卖出后插入tb_sell表卖出信息数据时,触发更新使仓库表tb_stock中的物品数量更新
DELIMITER //
CREATE TRIGGER auto_number AFTER INSERT
ON tb_sell FOR EACH ROW
BEGIN
DECLARE sellnum int(10);
SELECT number FROM tb_sell where id=NEW.id INTO @sellnum;
UPDATE tb_stock SET number=number-@sellnum WHERE goodsname='马克杯350ML';
END
//
INSERT INTO tb_sell(goodsname,goodstype,number,price,amount) VALUES ('马克杯350ML',1,1,29.80,29.80);
SELECT * FROM tb_stock WHERE goodsname='马克杯350ML';
删除触发器
DROP TRIGGER 触发器名称;