Хранимая процедура MySQL с Insert Select и пользовательской переменной

Проблема: у меня есть хранимая процедура 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 всегда запоминается с предыдущего запуска хранимой процедуры. Я также попытался установить его на ноль после вставки.

Заметки:

  1. Я использую @ переменная для увеличения и отслеживания номера строки. Возможно, есть еще один вариант здесь?
  2. Кажется, проблема связана с предложением "Имею". Когда я запускаю похожий, но другой запрос без предложения, переменная сбрасывается без проблем.

Вопрос: почему я не могу установить @mycount в ноль, прежде чем бежать каждый раз? Если он сбрасывается и просто предложение "Имеет" вызывает неожиданный подсчет, есть ли лучший способ переписать мой SQL?

Я надеюсь, что кто-то столкнулся с чем-то подобным, так как это кажется довольно неясным.

3 ответа

Я думаю, что вы используете переменную сеанса (например, @mycount). Проверьте ниже сайта, вы получите ответ

MySQL: @variable против переменной. Какая разница?

В следующей SQL Fiddle я не могу воспроизвести проблему, которую вы ставите, теоретически работает так, как ожидалось.

ОБНОВИТЬ

Пытаться:

DELIMITER //

CREATE PROCEDURE doSomething()
BEGIN
    SET @mycount := 0;
    INSERT INTO results (data_id, mycounter)
        SELECT der.id, (@mycount := @mycount + 1)
        FROM (
            SELECT data.id
            FROM data
                LEFT JOIN results ON data.id = results.data_id
            WHERE ...
            GROUP BY ...
            HAVING ...
            ORDER BY ...
        ) der;
END //

DELIMITER ;

Я не нахожу причин, по которым ваш код не должен работать. В любом случае, попробуйте метод ниже.

INSERT INTO results (data_id, mycounter)
select a.id, a.cnt from (
select @mycount := 0 from dual
join ( SELECT data.id, (@mycount := @mycount+1) cnt
        FROM data LEFT JOIN results ON data.id = results.data_id
        WHERE ... GROUP BY ...)) a;

В этом случае вам не нужно указывать SET @mycount := 0;

Другие вопросы по тегам