我有一张5700条记录的表格。主键是整数。现在我注意到缺少一些值。像这样:
100 data
101 data
102 data
104 data
缺少 103
。如何在一个SQL命令中更新所有行以使顺序正确(104
在我的示例中变为103
?
答案 0 :(得分:19)
试试这个:
SET @var:=0;
UPDATE `table` SET `id`=(@var:=@var+1);
ALTER TABLE `table` AUTO_INCREMENT=1;
答案 1 :(得分:10)
这样做没有意义。
已删除记录中的ID不会故意重复使用 - 例如,确保从其他表到先前删除的记录的引用不会突然指向错误的记录。尝试改变这一点并不是一个好主意。
如果您想要一个没有漏洞的编号列表,请创建第二个int
列,在必要时(即删除记录时)在客户端程序中重新排序。
答案 2 :(得分: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`;
除非您这样做以便随意选择记录,否则您应该重新考虑您的方法。
答案 3 :(得分:1)
我建议不要弄乱你的PK,除非你别无选择,当其他表引用id列时,它可能导致整个地方破损。如果PK真的容忍没有差距,那么选择PK可能并不理想......
如果你真的认为你应该这样做(并确保在其他表格中没有任何内容会破裂):
答案 4 :(得分:1)
另一种方法,不截断整个表:
-- Make Backup of original table's content
CREATE TABLE `orig_tbl_backup` SELECT * FROM `orig_tbl`;
-- Drop needed column.
ALTER TABLE `orig_tbl` DROP `id`;
-- Re-create it
ALTER TABLE `orig_tbl` AUTO_INCREMENT = 1;
ALTER TABLE `orig_tbl` ADD `id` int UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST;