我在表 '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...HANDLER和 RESIGNAL将解决这个问题。
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
将传递错误。
关于MySQL:在 SQLException 上将 session 变量设置为 NULL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15751805/