Я пытаюсь использовать этот запрос MySQL:
SET @a:=0; UPDATE tbl SET sortId=@a:=@a+1 ORDER BY sortId;
К сожалению, я получаю эту ошибку:
"Параметр '@a' должен быть определен"
Действительно ли это возможно к пакетным командам в 1 запрос как это, или я должен создать хранимую процедуру для этого?
Я думаю, что вам нужна хранимая процедура для любого типа statefullness. Есть ли причина, по которой вы не хотели ее создавать?
Кроме того, как вы выполняете этот код? В редакторе типа SQL Server Manager или как строку в программе?
Ваш запрос мне подходит. Я попытался запустить его из 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 sortId=@a:=@a+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 SortId=@a:=@a+1 ORDER BY SortId;
END //
DELIMITER ;
И для ее выполнения используйте это:
CALL updateSortIds();
Вы неправильно разместили присвоение переменной:
SET @a:=0; UPDATE tbl SET @a:=sortId=@a+1 ORDER BY sortId;