MYSQL存储过程仅更新记录

MYSQL存储过程仅更新记录,mysql,stored-procedures,Mysql,Stored Procedures,当MYSQL存储过程应该更新WHERE id in子句中的所有id时,它只更新一条记录。当我在存储过程之外运行SELECT和UPDATE时,它可以正常工作。有什么建议吗 DELIMITER $$ CREATE PROCEDURE update_ids(IN source int(10),IN target int(10)) BEGIN DECLARE idList varchar(5000) DEFAULT NULL; SET idList = (SELECT GROUP_CON

当MYSQL存储过程应该更新WHERE id in子句中的所有id时,它只更新一条记录。当我在存储过程之外运行SELECT和UPDATE时,它可以正常工作。有什么建议吗

DELIMITER $$
CREATE PROCEDURE update_ids(IN source int(10),IN target int(10))
BEGIN
    DECLARE idList varchar(5000) DEFAULT NULL;
    SET idList = (SELECT GROUP_CONCAT(id SEPARATOR ', ') FROM myTable ii WHERE ii.generic_id = source);
    UPDATE myTable i SET i.generic_id = target WHERE i.id IN (idList);

END$$
DELIMITER ;
然后我叫它->

CALL update_generic_ids(63, 1258);
更新:1行生效


提前感谢,

请尝试下面的代码块,希望它能解决您的问题! 如果有任何问题,请联系我! 分隔符$$ 在源int10和目标int10中创建过程更新\u ids 开始 声明idList varchar5000默认为NULL; -SET idList=从myTable ii中选择GROUP_CONCATid SEPARATOR',,其中ii.generic_id=源; 更新myTable i SET i.generic_id=i.id所在的目标 从myTable ii中选择id,其中ii.generic\u id=源 ;

结束$$ 定界符;

事实上,根据我的评论,我认为这可能是答案

这两个查询之间有着天壤之别:

UPDATE a SET b = c WHERE d IN ('1,2,3,4')

UPDATE a SET b = c WHERE d IN (1,2,3,4)
我建议您修改您的过程,这样您就不会将ID列表存储在字符串变量中。实际上,您不需要存储任何内容,只需将select生成的列表放入更新:

    UPDATE myTable i SET i.generic_id = target 
    WHERE i.id IN 
       (SELECT id SEPARATOR FROM myTable ii WHERE ii.generic_id = source);

您是否查看过表中有多少行实际受到影响?这可能只是您的查询工具的一种方式,表示执行了1个过程。您是否检查了idList的内容?可能你只得到一个结果,或者就像Caius说的,1个过程executedPs,我不确定你运行单独测试的方式和你的过程逻辑是否相同。运行一个select返回一个充满逗号分隔ID的字符串,复制它,然后将它粘贴到一个字符串中。在查询工具中更新查询并运行更新,但不能将一个充满id的字符串放入变量,然后将单个变量传递到in列表中-db不会将其视为id号列表。它将把它看作一个充满数字和逗号的字符串。如果没有Id为“1,2,3,4”的行,则查询将不起作用!例如,如果您不理解这两个查询之间的区别,请告诉我们:更新集合b=c,其中“1,2,3,4”中的d,与更新集合b=c,其中“1,2,3,4”中的d,如果您喜欢,Caius,您也可以清理代码并丢弃空闲的东西!感谢您的评论,但这只是一小段代码,目的就是解决问题。不管怎样,谢谢:是的,我一直觉得有知识的人有责任把它教给别人,但是如果你认为在你把其中一行复制到程序末尾后,在上面留下X行无用的代码来修复某人的坏程序是好的,那么我是谁来劝阻你呢!?StackOverflow应该是关于产生好的答案,而不是尽可能少的努力,这样你就可以成为西方最快的枪并抓住那个代表…不要把它当成个人问题,如果1000行代码会让你的生活陷入地狱!比在代码中编写或解决问题更好!我祈祷我永远不必编写您编写的任何代码: