【问题标题】:MySQL Continue Error Handler for INSERT IGNORE用于 INSERT IGNORE 的 MySQL 继续错误处理程序
【发布时间】:2021-08-22 13:02:46
【问题描述】:

在我的存储过程中,我有多个从一个数据库到另一个数据库的 INSERT IGNORE INTO 语句,但它们可能没有相同的表。所以我要做的就是跳过那个 SQL 语句,如果表不存在则继续下一个。

这是我的代码:

SET @ins = CONCAT('INSERT IGNORE INTO ', databaseName, '.currentYear SET year = YEAR(now()) + 1;');
PREPARE stmt FROM @ins;
EXECUTE stmt;
SET @ins = CONCAT('INSERT IGNORE INTO ', databaseName, '.table1 SELECT * FROM table1;');
PREPARE stmt FROM @ins;
EXECUTE stmt;
SET @ins = CONCAT('INSERT IGNORE INTO ', databaseName, '.table2 SELECT * FROM table2;');
PREPARE stmt FROM @ins;
EXECUTE stmt;
SET @ins = CONCAT('INSERT IGNORE INTO ', databaseName, '.table3 SELECT * FROM table3;');
PREPARE stmt FROM @ins;
EXECUTE stmt;

等等.. 100 多个这样的语句。因此,当其中一个引发异常“表不存在”时,我想忽略该错误并继续下一条语句,依此类推。我怎样才能做到这一点?

提前谢谢你!

【问题讨论】:

  • 这是Transact-SQL的命令,我用的是MySQL
  • 您可以查看here,但如果您不需要丢失的表,您是否可以仅更改您想要的表的查询 - 删除存储过程中使用的行他们?
  • 谢谢你的回答,我会仔细看看那个帖子。不,我无法更改查询,因为会有一个包含这些表的数据库,我永远不会知道数据库是否有某些表,或者是否没有,这就是过程如此长的原因。跨度>

标签: mysql sql error-handling dbforge


【解决方案1】:

您在 sql 中打开但未关闭其中一个引号

【讨论】:

  • 是的,我手动输入了代码,引号很好,这不是问题 :) 已编辑
【解决方案2】:

我找到了一个解决方案,它实际上非常简单。第一步是声明一个CONTINUE HANDLER FOR 1146(“表不存在”的mySQL错误代码)然后在收到错误代码(1146)时将一个变量设置为TRUE。下一步是在EXECUTE 之前简单地使用If 语句来询问变量是否设置为TRUE 或FALSE。如果FALSE,EXECUTE stmt。在每个PREPARE 语句之前,我们需要将变量设置为FALSE,以防它被CONTINUE HANDLER 触发并设置为TRUE。

示例代码如下:

DECLARE CONTINUE HANDLER FOR 1146 SET @error = TRUE;
SET @ins = CONCAT('INSERT IGNORE INTO ', databaseName, '.currentYear SET year = YEAR(now()) + 1;');
SET @error = FALSE;
PREPARE stmt FROM @ins;
IF @error = FALSE THEN EXECUTE stmt; END IF;
SET @ins = CONCAT('INSERT IGNORE INTO ', databaseName, '.table1 SELECT * FROM table1;');
SET @error = FALSE;
PREPARE stmt FROM @ins;
IF @error = FALSE THEN EXECUTE stmt; END IF;
SET @ins = CONCAT('INSERT IGNORE INTO ', databaseName, '.table1 SELECT * FROM table1;');
SET @error = FALSE;
PREPARE stmt FROM @ins;
IF @error = FALSE THEN EXECUTE stmt; END IF;       etc.

这样,如果目标数据库中不存在该表,我们就可以在我们的过程中更改或添加插入语句(用于新表)而不会出错。仍有待进一步测试,但它现在可以完成工作。我希望有人会发现这个答案很有用。干杯!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-14
    • 1970-01-01
    相关资源
    最近更新 更多