我想运行更新查询。
查询将针对多个数据库运行 - 并非每个数据库都有该表。
如果表不存在,我不希望尝试更新。我不想抛出任何错误——我只想忽略更新。
有任何想法吗?
编辑:为了清楚起见-查询是在自动部署中执行的-不可能进行人工交互。
EDIT2:说明更新是否应该运行的逻辑需要在 MySql 查询本身中。这不是通过命令提示符或批处理或托管代码运行的。
我想运行更新查询。
查询将针对多个数据库运行 - 并非每个数据库都有该表。
如果表不存在,我不希望尝试更新。我不想抛出任何错误——我只想忽略更新。
有任何想法吗?
编辑:为了清楚起见-查询是在自动部署中执行的-不可能进行人工交互。
EDIT2:说明更新是否应该运行的逻辑需要在 MySql 查询本身中。这不是通过命令提示符或批处理或托管代码运行的。
要在本机 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
.
您可以对表名进行描述,如果结果为空,则不要运行更新。您可以在一个简短的脚本中执行此操作,尽管我不确定您使用的是什么语言。如果您在这里严格查看数据库,您也可以在存储过程中管理它。
您可以先运行查询以查看该表是否存在,然后运行实际查询。
前任:
table_exists_query = Select count(*) from INFORMATION_SCHEMA.tables where table_name='xxxx';
if(run_query(table_exists_query)==1) 运行实际查询