提问者:小点点

在多变量访问中,编号是否安全


我正在尝试将select部分中的行编号转移到服务器端。

我正在做以下工作:

SET @a=0;

SELECT @a:=@a+1, id
       /*, other fields*/
FROM tmytable 
WHERE (id >10) AND (id!= 73) /*etc.*/
order by id desc;

代码提供了我想要的内容:行的编号是正确的,而不考虑where子句,顺序和其他情况。 然而,我想知道如何使声明更安全。 我假设并发会话可能同时处理同一个数据库变量,并且编号将从@a的某个未定义值开始,不同于0+1。 我希望排除事务和表锁定,因为我需要只读访问,而表锁定可能会降低DB性能。 有没有方法在select语句中声明和插入变量?


共1个答案

匿名用户

不要使用变量。 使用row_number():

SELECT row_number() over (order by id desc), id
       #, other fields
FROM tmytable 
WHERE (id > 10) AND (id <> 73) #etc.
ORDER BY id DESC;

我不知道你说的“安全”是什么意思。 这是一个SQL查询,它将作为一个单元运行,独立于其他会话(在大多数情况下)。