mysql 触发器for循环_Mysql触发器在循环之前声明

MySQL不具备必要的语句级触发器在标准的方式来实现这一点,但是我创建了以下解决方法。在before触发器中,在第一行之前,它会检查ROW_COUNT是否为-1,这意味着尚未插入行,并将默认值1设置为@x。然后可以在更新后使用@x。在before触发器中,在第二行之前,当它检查ROW_COUNT时,它现在是1或更高,如果你的after触发器插入了更多的行,那么它不再是-1,所以初始化不会再次运行。

DROP TRIGGER record_before_update;

DELIMITER $$

CREATE TRIGGER record_before_update

BEFORE UPDATE ON record

FOR EACH ROW

BEGIN

DECLARE y INT;

SET y = (SELECT ROW_COUNT());

IF y = -1 THEN

SET @x = 1;

END IF;

END$$

DELIMITER ;

DROP TRIGGER record_after_update;

DELIMITER $$

CREATE TRIGGER record_after_update

AFTER UPDATE ON record

FOR EACH ROW

BEGIN

#use @x in something

END$$

DELIMITER ;

注意,在您的交易使用的触发将需要语句之前任何其他更新被称为否则ROW_COUNT不会是-1。而这个例子是为了更新,你需要插入触发器的同样的东西。

如果有助于看到一个真实的例子,这里是我如何使用它。当不同“区域”中的一堆行有更新时,它只会通过维护已经更新的区域阵列来更新单个区域。

DROP TRIGGER record_before_update;

DELIMITER $$

CREATE TRIGGER record_before_update

BEFORE UPDATE ON record

FOR EACH ROW

BEGIN

DECLARE y INT;

SET y = (SELECT ROW_COUNT());

IF y = -1 THEN

SET @x = NULL;

END IF;

END$$

DELIMITER ;

DROP TRIGGER record_after_update;

DELIMITER $$

CREATE TRIGGER record_after_update

AFTER UPDATE ON record

FOR EACH ROW

BEGIN

DELETE FROM record_change where record_id = NEW.id;

INSERT INTO record_change(record_id, number) VALUES(NEW.id, @x);

IF @x IS NULL OR FIND_IN_SET(NEW.zone_id, @x) = 0 THEN

SET @x = CONCAT_WS(',', @x, NEW.zone_id);

DELETE FROM zone_change where zone_id = NEW.zone_id;

INSERT INTO zone_change(zone_id, number) VALUES(NEW.zone_id, @x);

END IF;

END$$

DELIMITER ;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值