我想运行更新查询。
查询将针对多个数据库运行 - 并非每个数据库都有该表。
如果表不存在,我不想尝试更新。我不想抛出任何错误 - 我只想忽略更新。
有什么想法吗?
编辑:明确一点——查询是在自动部署中执行的——不可能进行人工交互。
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/