Хранимая процедура 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
всегда запоминается с предыдущего запуска хранимой процедуры. Я также попытался установить его на ноль после вставки.
Заметки:
- Я использую
@
переменная для увеличения и отслеживания номера строки. Возможно, есть еще один вариант здесь? - Кажется, проблема связана с предложением "Имею". Когда я запускаю похожий, но другой запрос без предложения, переменная сбрасывается без проблем.
Вопрос: почему я не могу установить @mycount
в ноль, прежде чем бежать каждый раз? Если он сбрасывается и просто предложение "Имеет" вызывает неожиданный подсчет, есть ли лучший способ переписать мой SQL?
Я надеюсь, что кто-то столкнулся с чем-то подобным, так как это кажется довольно неясным.
3 ответа
Я думаю, что вы используете переменную сеанса (например, @mycount). Проверьте ниже сайта, вы получите ответ
В следующей 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;