2017-02-11 52 views
0

我行這樣:我如何重新索引計數器以連續增加MySQL?

+----+------+-------+ 
| id | name | order | 
+----+------+-------+ 
| 1 | foo |  2 | 
| 2 | bar |  4 | 
| 3 | jam |  1 | 
| 4 | ban |  3 | 
+----+------+-------+ 

可以想像,如果我要刪除的行3,我們會有這樣的:

+----+------+-------+ 
| id | name | order | 
+----+------+-------+ 
| 1 | foo |  2 | 
| 2 | bar |  4 | 
| 4 | ban |  3 | 
+----+------+-------+ 

我想重置在表中的順序,因此它成爲:

+----+------+-------+ 
| id | name | order | 
+----+------+-------+ 
| 1 | foo |  1 | 
| 2 | bar |  3 | 
| 4 | ban |  2 | 
+----+------+-------+ 

即從1開始遞增,而不改變「順序」。

我該怎麼做?

+0

訂單欄是唯一的嗎? – GurV

+0

@GurV是的,'order'列是唯一的。 – think123

回答

1

考慮到order列是獨一無二的,你可以使用用戶變量與更新加入這樣的:

update t t1 
join (
    select id, 
     @rn := @rn + 1 rn 
    from (
     select * 
     from t 
     order by `order` 
     ) t 
    cross join (
     select @rn := 0 
     ) t2 
    ) t2 on t1.id = t2.id 

set t1.`order` = t2.rn; 
1

像GurV答案,但更簡單:

SET @rn := 0; 

UPDATE MyTable 
SET `order` = (@rn:[email protected]+1) 
ORDER BY `order`; 

說明:初始化會話變量@rn爲零。按order的順序爲每一行運行更新,並設置order列(我建議您選擇與關鍵字不同的列名稱)。

將該列設置爲的值是一個表達式,該表達式對每一行都使用變量賦值語法,它將增加變量。

+0

肯定更短:)感謝這一點 - 但只是我從測試中發現的一個問題,我現在將編輯 – think123