Mysql按变量循环递增

时间:2012-10-01 19:09:17

标签: mysql variables loops increment

我正在尝试使用简单的MySQL查询来更新我的表位置。 我们假设我有一个带有ID,一个writer_id和一个位置字段的书表。

我希望能够拥有1 ... x的位置,但是每个writer_id。 如果我删除一条记录,我的位置会有一个间隙,所以这就是为什么我想要一个简单的查询来重置所有位置而没有间隙。

目前我有以下代码(有效),但我认为这应该可以更容易(并且可能更快)。

set @position := 0;
set @lastDependency := 0;
set @previousDependency := -1;

UPDATE `book` SET 
`writer_id`=(@lastDependency:=`writer_id`), -- Set writer_id of current row
position=( 
   IF (
       NOT @lastDependency=@previousDependency,
           @position:=1,            -- New writer_id => set position to 1
           @position:=@position+1   -- Same writer id, increment position
   )
), 
`writer_id`=(@previousDependency:=`writer_id`) -- Set writer_id of last used row 
ORDER BY `writer_id`, position ASC -- Order by current positions

我也可以使用PHP循环遍历所有记录并逐个保存,但我想这不会更好

2 个答案:

答案 0 :(得分:1)

为什么不使用具有以下功能的触发器:

“当一行被删除时,将比删除的那些更大的写入者ID减少一个”

或以伪代码说出来:

create trigger for delete...
    update book 
    set writer_id = writer_id - 1 
    where writer_id > deleted.writer_id 

答案 1 :(得分:0)

让我引用MySQL documentation给你:

  

作为一般规则,您不应该为用户变量赋值并在同一语句中读取值。您可能会得到您期望的结果,但这不能保证。涉及用户变量的表达式的评估顺序是未定义的,可能会根据给定语句中包含的元素进行更改;此外,MySQL服务器版本之间的订单不保证相同。

所以你尝试做事的方式可能会工作,但绝对没有保证。因此我建议你用PHP而不是MySQL来做这件事。或者您使用stored procedure在MySQL中执行此操作。