2010-03-31 2 views
6

Я пытаюсь использовать этот запрос MySQL:Использование переменных MySQL в запросе

SET @a:=0; UPDATE tbl SET [email protected]:[email protected]+1 ORDER BY sortId; 

К сожалению, я получаю эту ошибку:
«„@a“параметр должен быть определен»

Можно для пакетных команд в 1 запрос вроде этого, или мне нужно создать хранимую процедуру для этого?

ответ

2

Я думаю, что вам нужна хранимая процедура для любого состояния statefullness. Есть ли причина, по которой вы не хотели ее создавать?

Также как вы управляете этим кодом? Это в редакторе, таком как SQL Server Manager или в виде строки в программе?

+2

Хранимые Procs в MySQL являются боль для управления и развертывания. Они требуют предоставления доступа учетным записям пользователей к таблице mysql.proc, а резервное копирование и восстановление БД не включает в себя SP. Поддержка SP в MySQL действительно оставляет желать лучшего. –

+0

Похоже, вы хотите заказать таблицу из 0 - N. Есть ли причина, по которой вы не можете использовать столбец идентификатора, чтобы данные увеличивались при вставке? Или это существующие данные, которые вы не можете перезагрузить? Я попробовал это в SQL Server: обновления TBL набор sortId = 0 обновления TBL набор sortId = (SELECT COUNT (*) от ТПСА где sortId = 0) Я надеялся, что выбор будет выполняться для каждой строки и опускаюсь значения из N - 0, но он был выполнен только один раз. –

+0

К сожалению, Джошуа прав, мне нужно использовать SP для этого. –

5

Вы поместили назначение переменной в неправильном месте:

SET @a:=0; UPDATE tbl SET @a:[email protected]+1 ORDER BY sortId; 
2

Ваш запрос отлично работает для меня. Я попытался запустить его с помощью MySQL Query Browser:

CREATE TABLE tbl (Id INT NOT NULL, SortId INT NOT NULL); 
INSERT INTO tbl (Id, SortId) VALUES (1, 9), (2, 22), (3, 13); 

SET @a:=0; 
UPDATE tbl SET [email protected]:[email protected]+1 ORDER BY sortId; 

SELECT * From tbl; 

Результат:

Id sortId 
1 1 
2 3 
3 2 

Заметьте, что при выполнении запросов с помощью MySQL Query Browser необходимо ввести один запрос в строке, а не два на одной линии, как вы делаете , Если вы хотите поставить это в хранимой процедуре (вероятно, хорошая идея), вы можете создать его так:

DELIMITER // 

CREATE PROCEDURE updateSortIds() 
BEGIN 
    SET @a:=0; 
    UPDATE tbl SET [email protected]:[email protected]+1 ORDER BY SortId; 
END // 

DELIMITER ; 

И выполнить его, используйте:

CALL updateSortIds(); 
Смежные вопросы