2017-07-07 4 views
0

MYSQLストアドプロシージャは、WHERE id IN句のすべてのIDを更新する必要がある場合に1レコードを更新します。ストアドプロシージャの外部で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プロシージャを実行ok"と言うかもしれません –

+0

'idList'の内容をチェックしましたか? 1つの結果しか得られないかもしれない、あるいはCaiusが言ったように、1つのプロシージャが実行された可能性があります。 – FMashiro

+0

Ps、私はあなたが別々のテストを実行しているかどうかと同じではありません。カンマで区切られたIDの文字列を返すselectを実行し、それをコピーしてaに貼り付けます。クエリツールでクエリを更新して更新を実行しますが、IDに完全な文字列を変数に代入して単一の変数をリストに渡すことはできません.dbは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

あなたが好きな場合は、コードを掃除してidlistのものも捨てることができます –

+0

ありがとう、Caius!あなたのコメントを感謝しますが、それはコードの小さな部分であり、目的は問題を解決します。とにかく、ありがとう:) –

+0

ええ、私はいつも知識を持つ人々は他の人にそれをよく教える責任があると感じましたが、あなたがコピーした後、無用なコードのX行に残して、プログラムの終わりまでの行のうちの1つを選んで、私はあなたを説得するために誰ですか? StackOverflowは、最善の努力をしないで、良い答えを生成することになっているので、あなたは西で最速の銃になることができます... –

0

実は、私のコメントのとおり、私は答えかもしれだと思います。..

これらの2つのクエリの違いの世界があります:

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); 
関連する問題