1

我想运行更新查询。

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

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

有任何想法吗?

编辑:为了清楚起见-查询是在自动部署中执行的-不可能进行人工交互。

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

4

3 回答 3

2

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

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

下面是一个存储过程的示例,它使用 aCONTINUE 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 ;

另一种选择是测试表是否存在,并有条件地运行该语句。同样,在原生 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.

于 2012-07-06T15:14:44.000 回答
0

您可以对表名进行描述,如果结果为空,则不要运行更新。您可以在一个简短的脚本中执行此操作,尽管我不确定您使用的是什么语言。如果您在这里严格查看数据库,您也可以在存储过程中管理它。

于 2012-07-06T14:55:30.963 回答
0

您可以先运行查询以查看该表是否存在,然后运行实际查询。

前任:

table_exists_query = Select count(*) from INFORMATION_SCHEMA.tables where table_name='xxxx';

if(run_query(table_exists_query)==1) 运行实际查询

于 2012-07-06T14:58:42.793 回答