在查询中使用MySQL变量

在查询中使用MySQL变量,mysql,Mysql,我正在尝试使用以下MySQL查询: SET @a:=0; UPDATE tbl SET sortId=@a:=@a+1 ORDER BY sortId; 不幸的是,我得到了这个错误: 必须定义参数'@a' 是否可以像这样将命令批处理到一个查询中,或者我需要为此创建一个存储过程?我认为您需要一个存储过程来实现任何类型的状态完整性。你不愿意创建一个有什么原因吗 还有,您是如何运行此代码的?它是在SQL Server Manager之类的编辑器中,还是作为程序中的字符串?您将变量赋值放在了错误的位置

我正在尝试使用以下MySQL查询:

SET @a:=0; UPDATE tbl SET sortId=@a:=@a+1 ORDER BY sortId;
不幸的是,我得到了这个错误: 必须定义参数'@a'


是否可以像这样将命令批处理到一个查询中,或者我需要为此创建一个存储过程?

我认为您需要一个存储过程来实现任何类型的状态完整性。你不愿意创建一个有什么原因吗


还有,您是如何运行此代码的?它是在SQL Server Manager之类的编辑器中,还是作为程序中的字符串?

您将变量赋值放在了错误的位置:

SET @a:=0; UPDATE tbl SET @a:=sortId=@a+1 ORDER BY sortId;

你的问题对我来说很好。我尝试从MySQL查询浏览器运行它:

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查询浏览器运行查询时,每行应输入一个查询,而不是像您现在这样在一行中输入两个查询。如果要将其放入存储过程中,可能是一个好主意,您可以这样创建它:

DELIMITER //

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

DELIMITER ;
要执行它,请使用以下命令:

CALL updateSortIds();

MySQL中的存储过程很难管理和部署。它们要求允许用户帐户访问mysql.proc表,并且备份和恢复数据库不包括SP。MySQL中的SP支持确实还有很多需要改进的地方。看起来您想从0到N对表进行排序。有什么原因使您不能使用标识列,以便在插入时增加数据?还是无法重新加载现有数据?我在SQL Server中尝试了这一点:update tbl set sortId=0 update tbl set sortId=select count*from tbl,其中sortId=0我希望select将对每一行执行,并将值从N-0递减,但它只执行了一次。不幸的是,Joshua是正确的,我确实需要使用SP来执行此操作。