MYSQL中触发器(trigger)和储存过程(procedur
一,触发器(trigger)
即:在一个表执行(insert,update,delete)操作之前或之后,自动触发了预先编写好的sql语句。
注意:触发的事件和触发器里的sql语句是一个事务操作,要么全部执行,要么都不执行;
语法:
CREATE TRIGGER triggerName
AFTER/BEFORE #触发时间 在操作之前或之后执行下面的sql
INSERT/UPDATE/DELETE #监视操作
ON tabel_name #监视对象
FOR EACH ROW #这句话在mysql是固定的
BEGIN
sql...;
END;
AFTER#是先完成数据的增删改,再触发,触发的语句晚于监视的增删改操作,无法影响前面的增删改动作;
BEFORE#是先完成触发,再增删改,触发的语句先于监视的增删改,我们就有机会判断,修改即将发生的操作;
例:
当一个订单产生时,商品库存对应减少
订单表 order_base 字段 order_id,order_goods_id,order_goods_num
商品表 goods_base 字段 goods_id,goods_num
//设置定界符
DELIMITER $$
CREATE TRIGGER order_add_goods_decu
AFTER#触发时间
INSERT#监视操作
ON order_base#监视对象
FOR EACH ROW
BEGIN
UPDATE goods_base SET goods_num = goods_num - new.order_goods_num WHERE goods_id = new.order_goods_id; #触发事件
END$$
DELIMITER ;
(new.field:添加数据,old.field:删除或需要更新的数据)
for each row 的作用:每影响一行触发一次,如果在影响100行,执行100次
二,储存过程(procedure)
语法:
DELIMITER $$
CREATE PROCEDURE procedureName()
BEGIN
sql...
END$$
DELIMITER ;
#查看procedure
SHOW PROCEDURE STATUS;
#调用procedure
CALL procedureName();
#在储存过程中调用参数
DELIMITER $$
CREATE PROCEDURE goods_name(goods_id INT,goods_common_id INT)
BEGIN
SELECT CONCAT('id',goods_id,'name',goods_common_id);
SELECT CONCAT('info',goods_common_id);
END$$
DELIMITER ;
#调用procedure
CALL goods_name(10,12);
DECLARE column_name INT() DEFAULT 0;#DECLARE 在存储过程和函数的BEGIN与END之间定义变量(DECLARE 和SET的区别)
CONCAT() 函数用于将多个字符串连接成一个字符串,如有任何一个参数为NULL ,则返回值为 NULL。或许有一个或多个参数。 如果所有参数均为非二进制字符串,则结果为非二进制字符串。 如果自变量中含有任一二进制字符串,则结果为一个二进制字符串。一个数字参数被转化为与之相等的二进制字符串格式;若要避免这种情况,可使用显式类型 cast, 例如: SELECT CONCAT(CAST(int_col AS CHAR), char_col)