MySql - 如果表存在,只更新一些行 - 不希望抛出错误

标签 mysql if-statement exists

我想运行更新查询。

查询将针对多个数据库运行 - 并非每个数据库都有该表。

如果表不存在,我不想尝试更新。我不想抛出任何错误 - 我只想忽略更新。

有什么想法吗?

编辑:明确一点——查询是在自动部署中执行的——不可能进行人工交互。

EDIT2:说明更新是否应该运行的逻辑需要在 MySql 查询本身中。这不是通过命令提示符或批处理或托管代码运行的。

最佳答案

要在 native MySQL 中执行此操作(如在 mysql 脚本中),您可以使用存储过程。

这适用于一次性管理类型功能,您不希望将其作为应用程序的一部分来执行。 (话又说回来,如果这是应用程序的一部分,您将有条件逻辑来控制是否执行更新,或者如果表不存在则捕获并处理异常。)

下面是一个存储过程示例,它使用 CONTINUE HANDLER 捕获错误 1146(表不存在)并将其吞下,这样就不会向调用者返回任何错误。


DELIMITER //
DROP PROCEDURE IF EXISTS `table_doesnt_exist_handler`//
CREATE DEFINER=`root`@`%` PROCEDURE `table_doesnt_exist_handler`()
BEGIN
  DECLARE table_doesnt_exist BOOLEAN;
  DECLARE CONTINUE HANDLER FOR 1146 SET table_doesnt_exist = TRUE;

  UPDATE table_doesnt_exist SET foo = 1 WHERE foo = 1;

END//
CALL `table_doesnt_exist_handler`()//
DROP PROCEDURE IF EXISTS `table_doesnt_exist_handler`//
DELIMITER ;

另一种选择是测试表是否存在,并有条件地运行语句。同样,在 native MySQL 中,这需要在存储过程中完成。

DELIMITER //
DROP PROCEDURE IF EXISTS `table_doesnt_exist_approach_2`//
CREATE DEFINER=`root`@`%` PROCEDURE `table_doesnt_exist_approach_2`()
BEGIN
  SELECT @table_exists := COUNT(1) AS table_exists
    FROM information_schema.tables
   WHERE table_schema = DATABASE() 
     AND table_name = 'table_doesnt_exist';
  IF  @table_exists > 0 THEN
    UPDATE table_doesnt_exist SET foo = 2 WHERE foo = 1;
  END IF;
END//

CALL `table_doesnt_exist_approach_2`()//
DROP PROCEDURE IF EXISTS `table_doesnt_exist_approach_2`//
DELIMITER ;

我的偏好是使用CONTINUE HANDLER

关于MySql - 如果表存在,只更新一些行 - 不希望抛出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11364550/

相关文章:

MYSQL:用于存储变量的 varchar 与 int

php - 使用 PHP 从数据库返回 xml 响应时将代码缩短为更少的行

filter - 使用 MDX 进行子选择

Perl:检查是否设置了环境变量

resources - Domino 设计器错误 : "Resource already exists on disk" for service config file

MySQL:如何获取最后一次插入数据库的时间戳

c# - 发送回数据库时将换行符替换为\r\n

r - 在 R DataFrame 中使用多个条件进行计算

Java闰年检查程序。对边缘值无响应

c - 以下程序打印的输出是什么?如何评估if条件表达式?