在MySQL中创建一个rownum列

时间:2013-05-24 21:54:29

标签: mysql

我想在mySQL表中创建一个列(自动增量),我知道如何做到这一点,但是当我删除一行时,必须自动组织列,这是一个例子:

rownum |  name
------------
1      | aaaa
2      | bbbb
3      | cccc
4      | dddd

如果删除第二行,结果应为:

rownum |  name
------------
1      | aaaa
2      | cccc
3      | dddd

不是那样的:

rownum |  name
------------
1      | aaaa
3      | cccc
4      | dddd

无论如何都要这样做,或者每次删除/插入内容时都要编辑列?

4 个答案:

答案 0 :(得分:2)

为什么不创建一个虚拟行号

SELECT 
    @curRow := @curRow + 1 AS row_number,
    t.name
FROM    Tbll t
JOIN    (SELECT @curRow := 0) r;

因此,每次删除时都不必担心重新排序。

答案 1 :(得分:0)

我认为唯一的方法是删除主键列并重新创建它。您的所有行都将被重新分配,它们应按插入顺序排列。无论如何,我不明白为什么你会这样做,因为如果你有任何带外键的表,因为删除了列,你将不得不手动更改它们。你确定要这么做吗?

答案 2 :(得分:0)

您可以通过以下步骤重新排列自动增量:

 ALTER TABLE your_table DROP rownum;
 ALTER TABLE your_table AUTO_INCREMENT = 1;
 ALTER TABLE your_table ADD rownum bigint UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST; 

解释

  • 删除列rownum
  • 将auto_increment设置为1
  • 首先使用自动增量重新创建列rownum

答案 3 :(得分:0)

试试这个,在我自己的末端进行测试 -

ALTER TABLE test ADD COLUMN id2 int unsigned not null;
SET @a:=0;
UPDATE test SET id2=@a:=@a+1 ORDER BY `rownum`;
ALTER TABLE test DROP rownum;
ALTER TABLE test CHANGE id2 rownum int UNSIGNED NOT NULL AUTO_INCREMENT,
ADD PRIMARY KEY (rownum);

之前 -

before

之后 -

after

FYI 如果在屏幕截图中注意到,此查询块将更改列结构,但您始终可以在简单的单行查询运行中更改列结构。