如何确保auto_increment数字没有差距?

时间:2016-01-02 09:41:43

标签: mysql sql

我有一个auto_incrementing的问题案例,这是我的表我首先是如此顺利地增加id *

id*      name
1        name1
2        name2
3        name3
4        name4
5        name5
6        name6

但是当我删除记录并插入新记录时,id从7开始。

id*      name
1        name1
2        name2
3        name3
5        name5
6        name6
7        name7

这就是我想要的:

id*      name
1        name1
2        name2
3        name3
4        name7
5        name5
6        name6

我想要一个解决方案,其中填写每个数字,所以如果我删除一行,下一个autoinc号码将是我删除的号码而不是下一个号码。

3 个答案:

答案 0 :(得分:5)

首先,这些差距完全很好没问题。只是你的强迫症会迫使你认为这些数字必须遵循一种模式 - 他们不这样做。

  • auto_increment不是PHP功能,它是MySQL功能
  • auto_increment确保每一行都有唯一数字。它不涉及序号
  • auto_increment在并发环境中安全地工作 - 这意味着有很多用户连接到MySQL并做了一些事情,所有这些用户都必须能够处理数据库并且不能获得相同的id来识别一排。这是通过一个相当复杂的过程完成的,这是auto_increment产生差距的原因之一
  • {li> auto_incrementInnoDB用于磁盘上记录的物理组织 - 它使用auto_increment的功能,并且正在生成一个比之前更大的数字(这就是它的作用) ,比以前更大,不顺序)。使用它,构造一个b树,并在硬盘上依次写入记录。篡改auto_increment会使InnoDB重新平衡树。它意味着它会通过记录并重新创建索引,如果你搞砸了 - 这是你不想要的东西。以往

当你想到它时,你甚至会得到连续数字?没有什么,除了你的大脑可能会受到伤害,因为有一些想象的顺序。

对于序列号,请使用触发器创建它们。 auto_increment只有一份工作和一份工作 - 生成唯一数字。

答案 1 :(得分:2)

如果您想要获得看起来像列表的内容,我建议您保留字段“ID”,并添加另一个字段以用于以数字方式排序的名称。

无论如何,你可以通过这样的查询获得相同的结果:

SELECT name, @Rk := @Rk+1 AS Rank
FROM mynamestable, (Select @Rk := 0) AS Rk 

编辑: 此查询将返回表name中字段mynamestable中的所有记录以及将为数字增量(从1开始)的列(名为Rank),因此结果将为类似的东西:

name    Rank
Name1    1
Name2    2
Name3    3

答案 2 :(得分:-2)

为此,您可以在删除后使用trigger。更新大于已删除ID的所有ID(减1)

from selenium import webdriver
from selenium.webdriver.common.keys import Keys


browser=webdriver.Firefox()
browser.get('https://www.google.com/finance')

elem = browser.find_element_by_name("q")
elem.send_keys('IBM')
elem.send_keys(Keys.RETURN)

url = browser.current_url

historical = browser.find_element_by_xpath("/html/body/div/div/div[3]/div[2]/div/div[1]/div/div[1]/ul/li[6]/a")
historical.click()


elem2 = browser.find_element_by_name("startdate")
elem2.click()

# clear the text box
elem2.clear()

elem2.send_keys('Dec 23, 2001')
elem2.send_keys(Keys.RETURN)

你也必须reset auto_increment或为插入写另一个触发器,将id更新为max(id)