【问题标题】:Multiple update query in single prepare execute statement mysql单个准备执行语句mysql中的多个更新查询
【发布时间】:2018-01-15 02:08:55
【问题描述】:

我用谷歌搜索,但找不到我需要的东西。

我应该在单个语句中使用PREPAREEXECUTEMySQL 中执行多个更新查询。

示例查询:

update tableName set column2='a', column3='b' where column1=1; 
update tableName set column2='c', column3='d' where column1=2; 
update tableName set column2='f', column3='g' where column1=3;

SET @Query=myUpdateQuery;
PREPARE stmt FROM @Query;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

我尝试使用上述查询,但遇到错误

错误代码:1064 您的 SQL 语法有错误;

我正在努力克服这个错误。

请让我知道满足我需求的方法。提前致谢。

【问题讨论】:

    标签: c# mysql


    【解决方案1】:

    这是不可能的,因为PREPARE / EXECUTE stmt 一次只能处理一个语句。请参考以下 MySQL 问题:

    Execute multiple semi-colon separated query using mysql Prepared Statement

    但是,您可以将更新查询改写为一条语句:

    UPDATE tableName
    SET column2 = CASE WHEN column1 = 1 THEN 'a'
                       WHEN column1 = 2 THEN 'c'
                       WHEN column1 = 3 THEN 'f' END,
        column3 = CASE WHEN column1 = 1 THEN 'b'
                       WHEN column1 = 2 THEN 'd'
                       WHEN column1 = 3 THEN 'g' END
    WHERE column1 IN (1, 2, 3);
    

    【讨论】:

      【解决方案2】:

      试试这个。您必须将必须更新的 id 的逗号分隔列表作为过程的第一个参数传递。希望这会有所帮助。

      DELIMITER $$
      
      CREATE PROCEDURE proc_name(IN strIDs VARCHAR(255))
      BEGIN
        DECLARE strLen    INT DEFAULT 0;
        DECLARE SubStrLen INT DEFAULT 0;
      
        IF strIDs IS NULL THEN
          SET strIDs = '';
        END IF;
      
      do_this:
        LOOP
          SET strLen = LENGTH(strIDs);
      
          update tableName
          set column2 = 'a', column3 = 'b' 
          where column1 = SUBSTRING_INDEX(strIDs, ',', 1);
      
          SET SubStrLen = LENGTH(SUBSTRING_INDEX(strIDs, ',', 1));
          SET strIDs = MID(strIDs, SubStrLen, strLen);
      
          IF strIDs = NULL THEN
            LEAVE do_this;
          END IF;
        END LOOP do_this;
      
      END
      $$
      
      DELIMITER ;
      

      【讨论】:

      • 如果你发现这些建议对你有帮助,请不要忘记给一个up mark
      • 你为什么要发布两个不同的答案?
      【解决方案3】:

      执行以下示例。希望对你有帮助

      DELIMITER $$
      CREATE PROCEDURE proc_name()
      BEGIN
          update tableName set column2='a', column3='b' where column1=1; 
          update tableName set column2='c', column3='d' where column1=2; 
          update tableName set column2='f', column3='g' where column1=3;
      END$$
      DELIMITER ;
      

      【讨论】:

      • 非常感谢您的回答。万一我需要更新 1000 行我还没有准备好写 1000 更新语句。
      • 修正了你的错别字(这是一个 - 不是“coulum”) - 所以请不要再次撤消我的修正来重新引入这些错别字.....
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-13
      • 1970-01-01
      • 2016-12-26
      相关资源
      最近更新 更多