如何从 1 更新 id 集?

How to update id set from 1?

我有一个 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; 不是我的解决方案。

谢谢

Is there any query to update my existing id and make my id start from 1 and next id 2 and so on

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

假设你的 table 名字是 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;

当然有办法:

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

编辑

为避免重复键的问题,您可以运行之前像这样将当前 ID 临时更改为负等价物:

update table_name
set id  = 0 - id;

此查询适用于您的场景:

ALTER TABLE tablename DROP id

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

在我看来,您根本不应该乱用 auto_increment 列。让他们保持原样。他们唯一的工作就是唯一地标识一行。 如果您想要一个漂亮的序列号,请使用另一列(如果您愿意,请使其独一无二)!

你总是会 运行 惹上麻烦,而且总会发生一些事情,这些事情会打乱你漂亮的 1、2、3... 顺序。事务被回滚?繁荣,你的顺序是 1、2、3、5,... 而不是你想要的 1、2、3、4,...

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

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