2017-07-07 136 views
0

MYSQL存儲過程只更新一個記錄,當它應該更新其中的ID IN子句中的所有ID。當我在存儲過程之外運行SELECT和UPDATE時,它工作正常。有什麼建議麼? 1行的影響:>MYSQL存儲過程只記錄更新

CALL update_generic_ids(63, 1258); 

更新 -

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 ; 

然後,我通過調用它。

在此先感謝,

+1

你看了看錶中看到有多少行實際受到影響?這可能只是您的查詢工具說「1程序執行正常」的方式 –

+0

您是否檢查過'idList'的內容?可能是因爲你只能得到一個結果,或者正如Caius所說,執行了一個程序 – FMashiro

+0

Ps,我不確定你運行單獨測試和程序邏輯的方式是否相同。運行select返回一個包含逗號分隔ID的字符串是一回事,將它複製並粘貼到一個。在你的查詢工具中更新查詢並運行更新,但是你不能將一個包含ID的字符串放入一個變量中,然後將這個單一變量傳遞給列表中的數據庫 - 該數據庫不會將其視爲一個ID號列表。它會將它看作一個充滿數字和逗號的單個字符串。如果你沒有一個字面上是'1,2,3,4'的ID行,那麼查詢將不起作用! –

回答

0

一旦嘗試下面的代碼塊,希望它能解決您的問題! 如果有任何問題傳達給我! 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 ( SELECT id FROM myTable ii WHERE ii.generic_id = source );

END$$ DELIMITER ;

+0

如果你喜歡 –

+0

謝謝,蔡斯,你可以清理代碼並丟棄idlist的東西!感謝您的評論,但這是一小段代碼,目的是解決問題。無論如何,謝謝:) –

+0

是的,我一直覺得有知識的人有責任教給別人,但是如果你認爲在複製之後留下X行無用的代碼來修復某人的破壞程序是很好的其中一條直到節目結束,然後我是誰來勸阻你? StackOverflow應該是關於產生很好的答案,而不是做最少的努力,所以你可以成爲西部最快的槍,並抓住代表... –

0

其實,按我的意見,我認爲這是可能的答案..

有這兩個查詢之間的天壤之別:

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列表存儲在一個字符串變量中。其實你不需要存儲任何東西,只是把選擇生成的列表放到更新中:

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