問題: MySQL ストアド プロシージャがあり、プロシージャが呼び出されるたびにユーザー変数を 0 にリセットしたいのですが、変数は前回の実行ごとにその値を記憶しているようで、ゼロに初期化できません。
詳細:データ テーブル ( と呼ばれるdata
) があり、そこから読み取り、別のテーブル ( と呼ばれる) で 1 対 1 の相関関係でレコードを生成しますresults
。これは、Insert Select ステートメントを使用するストアド プロシージャで行います。@mycount
行ごとにインクリメントするユーザー変数も使用します。これが私のコードの簡略版です:
DELIMITER //
CREATE PROCEDURE doSomething
BEGIN
SET @mycount := 0;
INSERT INTO results (data_id, mycounter)
SELECT data.id, (@mycount := @mycount+1)
FROM data LEFT JOIN results ON data.id = results.data_id
WHERE ... GROUP BY ...
HAVING ...
ORDER BY ...;
END //
DELIMITER ;
分析:@mycount
これは、実行するたびにゼロにリセットする必要があり、SET
上記のステートメントがそれを達成していないことを除いて、ほぼ希望どおりに機能します。@mycount
デバッグ時に、前回のストアド プロシージャの実行からの最後の値が常に記憶されていることがわかります。また、挿入後にゼロに設定しようとしました。
ノート:
@
行番号をインクリメントして追跡するために変数を使用しています。おそらくここに別のオプションがありますか?- この問題は、Having 句に関連しているようです。having 句を使用せずに同様の別のクエリを実行すると、変数は問題なくリセットされます。
質問:@mycount
毎回実行する前にゼロに設定できないのはなぜですか? それがリセットされていて、Having 句が予期しないカウントを引き起こしているだけの場合、SQL を書き直すより良い方法はありますか?
これはかなりあいまいに思えるので、誰かが似たようなことに遭遇したことを願っています。