我在表'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'上的原始插入也失败(以防止两者之间的数据不匹配)。

有什么办法可以做到这一点?

最佳答案

经过研究,我发现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将继续传递错​​误。

08-06 03:50