MYSQL中触发器(trigger)和储存过程(procedur

2018-03-10  本文已影响0人  芮芮夕

一,触发器(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)

上一篇下一篇

猜你喜欢

热点阅读