如何从1更新id集?

时间:2017-03-31 09:22:09

标签: mysql sql auto-increment

我有一个id,即主键和自动增量。是否有任何查询可以更新我现有的id并让我的id从1开始,下一个ID为2,依旧等等。

例如

id  name
3   ABC
5   XYZ
9   PQR

注意: id已经是主要和自动增量,我不想截断我的ID。

如果可能的话我想得到

id  name
1   ABC
2   XYZ
3   PQR

ALTER TABLE table AUTO_INCREMENT = 1;不是我的解决方案。

由于

4 个答案:

答案 0 :(得分:4)

在我看来,你根本不应该搞乱auto_increment列。让他们保持原样。他们唯一的工作是唯一地识别一行。 如果你想要一个好的序列号,可以使用另一列(如果你愿意的话,让它变得独一无二)!

你总是会遇到麻烦,总会发生一些事情,那些混乱你的漂亮的1,2,3 ......序列。交易会回滚吗?繁荣,你的序列是1,2,3,5 ......而不是你想要的1,2,3,4 ...... ......

这也可能是一项非常繁重的操作。 auto_increment列始终也是主键。此表上的每个其他索引都包含主键。每次重置auto_increments时,都会重写此表上的每个索引。

所以我的建议是,不要乱用auto_increments

答案 1 :(得分:3)

  

是否有任何查询更新我现有的ID并让我的ID从1开始,下一个ID 2依旧等等

您可以做的是将表格的内容转移到另一个表格。重置自动增量计数器,将数据重新插入原始表,但让MySQL分配主键。

假设您的表名为mytable,您可以这样做:

CREATE TABLE mytable_tmp select * from mytable;
TRUNCATE TABLE mytable;
ALTER TABLE mytable AUTO_INCREMENT = 1;
INSERT INTO mytable(name) SELECT name FROM mytable_tmp ORDER BY id;
DROP TABLE mytable_tmp;

答案 2 :(得分:3)

当然有一种方法:

set @counter = 0;
update table_name
set id  = (@counter := @counter + 1);

修改

为避免重复键出现问题,您可以先运行此类操作,然后暂时将当前ID更改为负等值:

update table_name
set id  = 0 - id;

答案 3 :(得分:0)

此查询适用于您的方案:

ALTER TABLE tablename DROP id

ALTER TABLE tablename ADD id INT NOT NULL AUTO_INCREMENT FIRST, ADD PRIMARY KEY (id), AUTO_INCREMENT=1