我谷歌但我无法找到我需要的东西。
我应该使用PREPARE
中的EXECUTE
,MySQL
在单个语句中执行多个更新查询。
示例查询:
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语法出错;
我正在努力克服这个错误。
请让我知道完成我需要的方法。提前谢谢。
答案 0 :(得分: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);
答案 1 :(得分:0)
执行以下示例。希望它有所帮助
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 ;
答案 2 :(得分:0)
试试这个。你必须将你必须更新的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 ;