2012-07-06 66 views
1

我想运行更新查询。MySql - 仅在表存在时更新某些行 - 不希望抛出错误

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

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

任何想法?

编辑:只是要清楚 - 查询是在自动化部署中执行 - 没有可能的人机交互。

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

+0

到目前为止您尝试了什么,以及您收到了哪些错误?这个接受的答案似乎表明,如果表不存在,更新语句不会出错:http://stackoverflow.com/questions/1833687/sql-to-update-a-table-only-if-that-表存在在数据库中 – anotherdave 2012-07-06 14:54:28

+1

我可以确定表是否存在 - 但它是我无法得到的位。 “IF MyResult = 1 THEN Update myTable” – PeteGO 2012-07-06 15:03:33

+0

我在发布之前查看了您指向的链接 - 但“无损”不是我所追求的 - 它仍然会引发错误。 – PeteGO 2012-07-06 15:05:31

回答

2

以Native MySQL的做到这一点(如在一个MySQL脚本),你可以使用存储过程。

这适用于一次性管理类型函数,您不希望将其作为应用程序的一部分来执行此操作。 (然后,如果这是应用程序的一部分,则可以使用条件逻辑来控制是执行UPDATE还是捕捉并处理异常(如果该表不存在)。)

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

另一种选择是,以测试表的存在,并有条件地运行声明。在本地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

+1

我认为这是唯一的方法。认为会有一个更容易的,但显然不是!谢谢。 – PeteGO 2012-07-06 15:25:18

+0

解释将不胜感激 – 2012-07-06 15:29:41

+0

@ankit:条件执行SQL语句的条件'IF'测试在存储程序(存储过程,功能或触发器)之外的本地MySQL中不可用。 'CONTINUE HANDLER'是MySQL捕获和处理异常的方式。 – spencer7593 2012-07-06 15:44:13

0

你可以做一些类似于表名的描述,如果结果为空,那么不运行更新。你可以用简短的脚本来做到这一点,但我不确定你使用的是什么语言。如果您在此查看严格的数据库,您也可以在存储过程中管理它。

0

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

例:

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

如果(run_query(table_exists_query)== 1) 运行的实际查询

+0

尽我所知,无法使用run_query或IF。我已经更新了我的问题。 – PeteGO 2012-07-06 15:14:16

相关问题