MySQL:在 SQLException 上将 session 变量设置为 NULL

标签 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' 的原始插入也失败(以免两者之间的数据不匹配)。

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

最佳答案

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

关于MySQL:在 SQLException 上将 session 变量设置为 NULL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15751805/

相关文章:

mysql - 从具有外键的亲戚中选择?

mysql过滤器在其他列匹配的地方重复

php - 在数据库中保存 morphOne 多态

php - 下拉菜单 - 从 mysql 数据库填充

mysql - 我的 MySql 查询中创建触发器的错误在哪里

sql - PostgreSQL 触发器如何保持跨表一致性?

mysql - 分组最大值同一行中的值

sql - Oracle嵌套相关子查询问题

sql - sqlite查询优化

sql - Firebird - 获取触发器内所有修改的字段