Mysql不删除数据的情况下,让自增id重新排序

本文介绍两种Mysql自增ID重置的方法:一种是在不删除数据的前提下通过删除原有自增ID并重新创建来实现;另一种是直接清空数据表,并将自增字段的起始值恢复为1。

应用场景:Mysql(当你删除表中数据之后,造成自增id不连续,可能会导致需要用id进行的判断的时候不准确,所以我想到了要重新排序,当然前提是不能删除表中的数据!!!!)

一、不清空数据

原理:删除原有的自增ID,重新建立新的自增ID。

1,删除原有主键:

ALTER  TABLE  `table_name` DROP `id`;
  • 1

2,添加新主键字段并设置主键:

ALTER  TABLE  `table_name` ADD 'id' mediumint(6) PRIMARY KEY NOT NULL AUTO_INCREMENT FIRST;
  • 1

二、如果曾经的数据都不需要的话,可以直接清空所有数据,并将自增字段恢复从1开始计数

truncate table 表名

### 修复 MySQL 表中删除数据后自 ID 连续的问题 在 MySQL 中,当表中的某些记录被删除后,自字段(如 `id`)会留下空缺,导致连续的情况。为了解决这个问题,可以通过以下方法重新排序字段,使其恢复连续性。 #### 方法一:使用临时变量更新自字段 通过设置一个临时变量,并逐行更新表中的自字段值,可以实现重新编号的功能。这种方法适用于较小的数据量和简单的数据结构[^2]。 ```sql SET @new_id := 1; UPDATE admin SET id = (@new_id := @new_id + 1) ORDER BY id; ``` - **注意事项**: - 此方法可能在大表或复杂数据结构中引发性能问题。 - 如果表中存在外键约束或其他关联关系,可能会破坏数据完整性。 - 更新过程中需要避免并发操作,建议在事务中进行并设置适当的隔离级别以保证数据一致性。 #### 方法二:创建新表并重新插入数据 另一种更安全的方法是创建一个临时表,将原表的数据按顺序插入到临时表中,然后用临时表替换原表[^3]。 ```sql -- 创建临时表 CREATE TABLE temp_admin LIKE admin; -- 将数据按顺序插入到临时表 INSERT INTO temp_admin (id, username, password, mobile) SELECT (@row_num := @row_num + 1) AS id, username, password, mobile FROM admin, (SELECT @row_num := 0) r ORDER BY id; -- 删除原表 DROP TABLE admin; -- 将临时表重命名为原表名 RENAME TABLE temp_admin TO admin; ``` - **优点**:此方法会破坏原有表的外键约束,且能确保数据完整性。 - **缺点**:需要额外的空间来存储临时表,适合中小规模的数据集。 #### 方法三:重置自起始值 如果只需要重置自字段的起始值,而需要重新排序现有数据,可以通过 `ALTER TABLE` 语句调整自字段的初始值[^1]。 ```sql ALTER TABLE admin AUTO_INCREMENT = 1; ``` - **注意**:此方法仅更改自字段的起始值,会影响已存在的记录。 #### 方法四:添加辅助字段并重新排序 对于复杂的表结构,可以通过添加辅助字段来保存原始 ID 值,然后重新设置自字段[^4]。 ```sql -- 添加辅助字段 ALTER TABLE demo ADD old_id INT(10) NOT NULL; -- 更新辅助字段存储原始 ID UPDATE demo SET old_id = id; -- 修改自字段属性 ALTER TABLE demo MODIFY COLUMN id INT(10) NOT NULL AUTO_INCREMENT, ADD PRIMARY KEY (id); -- 恢复原始 ID 值(如果需要) UPDATE demo SET id = old_id; -- 删除辅助字段 ALTER TABLE demo DROP COLUMN old_id; ``` - **适用场景**:适用于需要保留原始 ID 值的场景。 ### 注意事项 - 在执行上述操作之前,建议备份表数据,以防操作失误导致数据丢失。 - 如果表中有外键约束,需先禁用外键检查,操作完成后重新启用。 - 并发环境下,建议锁定表以防止其他操作干扰。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

希文先森

您的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值