MySQL:在SQLException上将session var设置为NULL

时间:2013-04-01 21:00:04

标签: mysql sql triggers sqlexception

我在表'a'上有一个插入触发器,它基本上复制并转换查询以插入表'b'。这是此触发器的伪代码示例:

FOR EACH ROW
BEGIN
  IF @inserting IS NULL THEN
    SET @inserting = 1;
    INSERT INTO b SET
      col1 = NEW.col1
      col2 = NEW.cola
      col3 = some_stored_proc(NEW.col3);
    SET @inserting = NULL;
  END IF
END

但是,您可能会注意到,如果INSERT失败,@inserting将保留为1。如果表'b'的插入失败,我需要确保它被设置回NULL,同时导致表'a'上的原始插入失败(以便两者之间没有不匹配的数据)。

有没有办法实现这个目标?

1 个答案:

答案 0 :(得分:0)

在做了一些研究之后,我发现DECLARE...HANDLERRESIGNAL将解决这个问题。

FOR EACH ROW
BEGIN
  DECLARE EXIT HANDLER FOR SQLEXCEPTION
  BEGIN
    SET @inserting = NULL;
    RESIGNAL;
  END;
  IF @inserting IS NULL THEN
    SET @inserting = 1;
    INSERT INTO b SET
      col1 = NEW.col1
      col2 = NEW.cola
      col3 = some_stored_proc(NEW.col3);
    SET @inserting = NULL;
  END IF;
END

DECLARE EXIT HANDLER FOR SQLEXCEPTION允许您对SQL异常执行语句(并在完成后退出当前过程)。

RESIGNAL会传递错误。