如何在MySQL过程的CONCAT()中使用更新

如何在MySQL过程的CONCAT()中使用更新,mysql,stored-procedures,Mysql,Stored Procedures,我尝试通过过程更新exist表。但是我得到了一个错误:MySQL:#1064-您的SQL语法有一个错误;请查看与MySQL服务器版本对应的手册,以了解第1行的“=iOS,phone\u manufacture=Apple,phone\u model=iPhone,os\u vers=iOS X.X”附近使用的正确语法 我的程序: BEGIN DECLARE a, b INT; DECLARE a1, a2, a3, a4 TEXT; DECLARE cur1 CURSOR FOR SELECT

我尝试通过过程更新exist表。但是我得到了一个错误:MySQL:#1064-您的SQL语法有一个错误;请查看与MySQL服务器版本对应的手册,以了解第1行的“=iOS,
phone\u manufacture
=Apple,
phone\u model
=iPhone,
os\u vers
=iOS X.X”附近使用的正确语法

我的程序:

BEGIN 
DECLARE a, b INT;
DECLARE a1, a2, a3, a4 TEXT;
DECLARE cur1 CURSOR FOR SELECT id FROM z7_group;  
DECLARE CONTINUE HANDLER FOR NOT FOUND SET b = 1;  
OPEN cur1;   
SET b = 0; 
SET a1 = "iOS";
SET a2 = "Apple";
SET a3 = "iPhone";
SET a4 = "iOS X.X";
WHILE b = 0 DO  
FETCH cur1 INTO a;
IF b = 0 THEN
 SET @data_ all_group = (SELECT `myTables` FROM `all_group` WHERE id= a);
 SET @s = CONCAT('UPDATE ', @data_ all_group, 'SET `os` = ',a1,', `phone_manufacture` = ',a2,', `phone_model` = ',a3', `os_vers` = ',a4,');
 PREPARE stmt3 FROM @s;
 EXECUTE stmt3;
END IF;
END WHILE;
CLOSE cur1;
END;
您有两个选择: (还有更多,但我认为这是你想要的)

  • 将值用单引号括起来,并将其标记为:

    SET a1 = "'iOS'";
    SET a2 = "'Apple'";
    SET a3 = "'iPhone'";
    SET a4 = "'iOS X.X'";
    
    并修改句子:

    CONCAT('UPDATE ', @data_all_group, ' SET `os` = ',a1,', `phone_manufacture` = ',a2,', `phone_model` = ',a3,', `os_vers` = ',a4)
    
    结果将是:

    UPDATE your_table SET `os` = 'iOS', `phone_manufacture` = 'Apple', `phone_model` = 'iPhone', `os_vers` = 'iOS X.X'
    
  • 或:修复查询生成:

     SET @s = CONCAT('UPDATE ', @data_all_group
       , "SET `os` = '" , a1 ,"',"
       , "`phone_manufacture` = '",a2,"',"
       , "`phone_model` = '",a3,"',"
       , "`os_vers` = '",a4,"'");
    

  • 通常您不能使用
    作为分隔符(如果在存储过程中使用)。我很惊讶它被解析的如此之远。另一件需要注意的事情是,你只是在干扰任意数据,而没有逃逸到那里。那是行不通的。使用:
    SET os=?,phone\u manufacture=?,…
    然后执行。。。使用绑定变量
    CONCAT
    在这里是完全不必要的。@tadman但如果我使用ALTER TABLE来更新所有内容,那么使用占位符值并查看是否有帮助。您的表名是动态的是一个复杂的问题,但我相信您可以解决这个问题。