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