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

Posted

技术标签:

【中文标题】MySql - 如果表存在,只更新一些行 - 不希望抛出错误【英文标题】:MySql - only update some rows if the table exists - do not want an error thrown 【发布时间】:2012-07-06 14:50:35 【问题描述】:

我想运行更新查询。

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

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

有什么想法吗?

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

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

【问题讨论】:

到目前为止您尝试了哪些操作,遇到了哪些错误?这个接受的答案似乎表明如果表不存在,更新语句不会出错:***.com/questions/1833687/… 我可以确定该表是否存在 - 但这是我无法获得的那一点。 "IF MyResult = 1 THEN Update myTable" 我在发布之前查看了您指向的链接 - 但“无损坏”不是我所追求的 - 它仍然会引发错误。 @Pete:在原生 MySQL 中,您只能在存储过程中执行此操作。如果这是针对一次性管理类型的函数,那么一种选择是创建一个临时存储过程,执行它,然后删除它。 【参考方案1】:

要在本机 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

【讨论】:

我认为这是唯一的方法。以为会有一个更简单的,但显然不是!谢谢。 解释将不胜感激 @ankit:有条件地执行 SQL 语句的条件 IF 测试在存储程序(STORED PROCEDURE、FUNCTION 或 TRIGGER)之外的本机 MySQL 中不可用。 CONTINUE HANDLER 是 MySQL 捕获和处理异常的方式。【参考方案2】:

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

【讨论】:

【参考方案3】:

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

例如:

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

如果(运行查询(表存在查询)==1) 运行实际查询

【讨论】:

据我所知,不能使用 run_query 或 IF。我已经更新了我的问题。

以上是关于MySql - 如果表存在,只更新一些行 - 不希望抛出错误的主要内容,如果未能解决你的问题,请参考以下文章

如果值不存在,将值插入 MySQL 表?

Mysql,检查行是不是存在,如果它确实获取值,如果不插入

MySQL:如果表存在,截断并插入 ELSE 创建

MySQL:如果值存在,则对行进行更新,如果值不存在,则插入 [重复]

MySql 表插入,如果不存在,否则更新

MYSQL从另一个表更新数据,如果存在,否则插入[重复]