如何重新排序主键?

mar*_*stT 4 mysql

我有一张5700条记录的表格.主键是整数.现在我注意到缺少一些值.像这样:

100 data
101 data 
102 data
104 data
Run Code Online (Sandbox Code Playgroud)

103不见了.如何使秩序成为正确的,我可以更新所有的行(104成为103在我的例子)在一个SQL命令?

MLF*_*MLF 19

试试这个:

SET @var:=0;
UPDATE `table` SET `id`=(@var:=@var+1);
ALTER TABLE `table` AUTO_INCREMENT=1; 
Run Code Online (Sandbox Code Playgroud)


Pek*_*ica 10

这样做没有意义.

删除记录中的ID不会故意重复使用 - 例如,确保从其他表到先前删除的记录的引用不会突然指向 错误的记录.尝试改变这一点并不是一个好主意.

如果您想要一个没有漏洞的编号列表,请创建第二int列,在必要时(即删除记录时)在客户端程序中重新排序.

  • @sanmai你正在盲目地回答问题,即使这会导致不良做法.我认为这是一个可怕的想法,并且可能有害.质疑*问题*应该是在回答之前做的第一件事.请参阅[什么是XY问题?](http://meta.stackexchange.com/q/66377) (5认同)
  • 如果有人需要这样做,他可以有理由,即使你认为没有意义. (3认同)
  • @sanmai提供编号列表不是主键的工作.如果需要,请维护第二列.为此滥用PK只是愚蠢的. (3认同)

san*_*mai 7

不确定一个命令,但你可以用四个命令完成:

CREATE TABLE `temp` SELECT * FROM `orig_tbl`;
TRUNCATE `orig_tbl`;
-- counter doesn't reset in some old versions
ALTER TABLE `orig_tbl` AUTO_INCREMENT = 1; 
-- now we omit primary key column to let it seal the holes
INSERT INTO `orig_tbl` (`col1`, `col2`) SELECT `col1`, `col2` FROM `temp`;
Run Code Online (Sandbox Code Playgroud)

除非你这样做以便更容易随机选择记录,否则你真的应该重新思考你的方法.