重新sorting/重置自动递增主键

我有一个自动递增主键的MySQL表。 我删除了表中间的一些行。 现在我在ID栏中有这样的内容:12,13,14,19,20。我删除了15,16,17和18行。

我想重新分配/重置/重新sorting主键,使我有连续性,即使19 a 15,20 a 16等等。

我该怎么做?

您可以删除主键列并重新创build它。 所有的ID都应该被重新分配。

然而在大多数情况下这可能是一个坏主意。 如果你有其他表有这个表的外键,那么它绝对不会工作。

即使这个问题似乎是相当古老的,会为在这里search的人发表一个答案。

SET @count = 0; UPDATE `users` SET `users`.`id` = @count:= @count + 1; 

如果该列在其他表中用作外键,请确保对这些表中的外键关系使用ON UPDATE CASCADE而不是缺省的ON UPDATE NO ACTION

此外,为了重置AUTO_INCREMENT计数,您可以立即发出以下语句。

 ALTER TABLE `users` AUTO_INCREMENT = 1; 

对于MySQL,它会将值重置为MAX(id) + 1

要重置我的用户表的ID,我使用以下SQL查询。 上面已经说过,这会破坏你和其他桌子的关系。

 ALTER TABLE `users` DROP `id`; ALTER TABLE `users` AUTO_INCREMENT = 1; ALTER TABLE `users` ADD `id` int UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST; 

您可以简单地使用这个查询

 alter table abc auto_increment = 1; 

或者,从PhpMyAdmin,删除“自动增量”标志,保存,再次设置并save.this重置它。

 SET @num := 0; UPDATE your_table SET id = @num := (@num+1); ALTER TABLE your_table AUTO_INCREMENT =1; 

我认为这将做到这一点

您可以删除该列的主键自动增量function,然后每次更新该列之前先在查询表中对所有行进行计数,然后运行一个遍历该行计数的循环,将每个值插入相应的行,最后运行一个插入新行的查询,该行的值是总行数加1。 这将完美地工作,是一个试图完成你自己的人最绝对的解决scheme。 以下是您可能用于该function的代码示例:

 $table_row_count = mysql_result(mysql_query("SELECT COUNT(`field_1`) FROM `table`"), 0); $viewsrowsdata = mysql_query(" SELECT `rank`, `field1`, `field2`, `field3`, `field4` FROM (SELECT (@rank:=@rank+1) as `rank`, `field1`, `field2`, `field3`, `field4` FROM (SELECT * FROM `views`) a CROSS JOIN (SELECT @rank:=0) b ORDER BY rank ASC) c "); while ($row = mysql_fetch_assoc($viewsrowsdata)) { $data[] = $row; } foreach ($data as $row) { $new_field_1 = (int)$row['rank']; $old_field_1 = (int)$row['field1']; mysql_query("UPDATE `table` SET `field_1` = $new_field_1 WHERE `field_1` = $old_field_1"); } mysql_query("INSERT INTO `table` (`field1`, `field2`, `field3`, `field4`) VALUES ('$table_row_count' + 1, '$field_2_value', 'field_3_value', 'field_4_value')"); 

在这里,我创build了一个关联数组,这个数组是在查询内部的查询中添加了一个排列列,从而为每行提供了从1开始的排名值。然后,我遍历关联数组。

另一个select是获得行数,运行一个基本的select查询,获得关联数组,并通过相同的方式迭代它,但通过每次迭代更新的variables。 这是不太灵活,但会完成同样的事情。

 $table_row_count = mysql_result(mysql_query("SELECT COUNT(`field_1`) FROM `table`"), 0); $viewsrowsdata = mysql_query("SELECT * FROM `table`"); $updated_key = 0; while ($row = mysql_fetch_assoc($viewsrowsdata)) { $data[] = $row; } foreach ($data as $row) { $updated_key = $updated_key + 1; mysql_query("UPDATE `table` SET `field_1` = '$updated_key' WHERE `field_1` = '$row['field_1']'"); } mysql_query("INSERT INTO `table` (`field1`, `field2`, `field3`, `field4`) VALUES ('$table_row_count' + 1, '$field_2_value', 'field_3_value', 'field_4_value')"); 

对于InnoDB,这样做(这将删除表中的所有logging,首先做一个bakcup):

 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS ; SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION ; SET NAMES utf8 ; SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 ; SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 ; SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' ; SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 ; /* ================================================= */ drop table tablename; CREATE TABLE `tablename` ( table structure here! ) ENGINE=InnoDB AUTO_INCREMENT= ai number to reset DEFAULT CHARSET= char set here; /* ================================================= */ SET SQL_MODE=@OLD_SQL_MODE ; SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS ; SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS ; SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT ; SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS ; SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION ; SET SQL_NOTES=@OLD_SQL_NOTES ; 

我有同样的怀疑,但不能做任何改变,我决定做下面的事情,看到我的ID没有超过variables@count中设置的最大数量:

 SET @count = 40000000; UPDATE `users` SET `users`.`id` = @count:= @count + 1; SET @count = 0; UPDATE `users` SET `users`.`id` = @count:= @count + 1; ALTER TABLE `users` AUTO_INCREMENT = 1; 

解决scheme需要,但它是安全的,这是必要的,因为我的表拥有外部数据在另一个表中的数据。

最好的select是改变列并删除auto_increment属性。 然后发出另一个alter语句并将auto_increment放回到列上。 这会将计数重置为当前行的最大值+ 1,从而将外键引用保留回该表中,从数据库中的其他表或该列的任何其他键使用。

在phpmyadmin

注意:如果删除最后一行而不是中间行,这将起作用。

转到你的表 – >点击操作菜单 – >转到表选项 – >改变AUTO_INCREMENT从那里你想要开始。

你的表自动增量从那个开始。

尝试一下。 在这里输入图像描述

您也可以简单地避免使用数字标识作为主键。 如果表格中包含国家/地区信息,则可以使用国家/地区代码作为主要ID,或者如果持有条款,则可以使用永久链接。

您也可以简单地使用随机或MD5值。 所有这些选项都有它自己的好处,特别是在IT秒。 数字ID很容易枚举。