如何更改MySQL中的自动增量计数器?

时间:2011-11-17 03:36:00

标签: mysql auto-increment

我有一个ID字段,它是我的主键,只是一个int字段。

我的行数少于 300 ,但现在每次有人注册时,ID auto auto inc的输入真的很高,如 11800089,11800090等...... 是否有一种方法可以让它回来,以便它可以按照(310,311,312)的顺序。

谢谢!

6 个答案:

答案 0 :(得分:49)

ALTER TABLE tbl AUTO_INCREMENT=310;

请注意,您不想重复ID。如果数字很高,他们会以某种方式得到这种方式。请确保您没有较低ID号的关联数据。

http://dev.mysql.com/doc/refman/5.0/en/example-auto-increment.html

答案 1 :(得分:3)

可能有一种更快捷的方法,但这就是我要做的,以确保我重新创建ID;

如果您使用的是MySQL或其他SQL服务器,则需要:

  1. 备份数据库
  2. 删除id列
  3. 导出数据
  4. TRUNCATE或'清空'表格
  5. id列重新设为auto_increment
  6. 重新导入数据
  7. 这将破坏现有行的ID,因此如果这些是重要的,那么它就不是一个可行的选择。

答案 2 :(得分:1)

猜测您使用的是mysql,因为您正在使用PHP。您可以使用类似

的语句重置auto_increment
 alter table mytable autoincrement=301;

但要小心 - 因为当auto inc值重叠时会出现问题

答案 3 :(得分:1)

表的自动增量计数器可以(重新)设置两种方式:

  1. 通过执行查询,就像已经解释的其他人一样:

    //make shipping fields not required in checkout add_filter( 'woocommerce_shipping_fields', 'wc_npr_filter_shipping_fields', 10, 1 ); function wc_npr_filter_shipping_fields( $address_fields ) { $address_fields['shipping_first_name']['required'] = false; $address_fields['shipping_last_name']['required'] = false; $address_fields['shipping_address_1']['required'] = false; $address_fields['shipping_city']['required'] = false; $address_fields['shipping_postcode']['required'] = false; return $address_fields; }

  2. 使用Workbench或其他可视化数据库设计工具。我将在Workbench中展示它是如何完成的 - 但它在其他工具中也不应该有太大的不同。右键单击所需的表格,然后从上下文菜单中选择ALTER TABLE <table_name> AUTO_INCREMENT=<table_id>;。在底部,您可以看到更改表格的所有可用选项。选择Alter table,您将获得此表单: enter image description here

    然后在字段Options中设置所需的值,如图所示。 这基本上将执行第一个选项中显示的查询。

答案 4 :(得分:0)

我相信mysql会对id执行select max并将下一个选中。尝试将表的ID更新为所需的序列。你将遇到的问题是,如果它们被链接,你应该在fk的更新上放置一个Cascade。 我想到的一个问题是:

UPDATE Table SET id=(SELECT max(id)+1 FROM TAble WHERE id<700)

少于你拥有的11800090以及300 WHERE id&gt; 0附近的东西;

我相信如果你没有放置一个地方的话,那就是mysql投诉

答案 5 :(得分:0)

我正在玩一个类似的问题并找到了这个解决方案:

SET @newID=0;
UPDATE `test` SET ID=(@newID:=@newID+1) ORDER BY ID;
SET @c = (SELECT COUNT(ID) FROM `test`);
SET @s = CONCAT("ALTER TABLE `test` AUTO_INCREMENT = ",@c);
PREPARE stmt FROM @s;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;  

我希望能帮助处于类似情况的人!