我有一个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号码将是我删除的号码而不是下一个号码。
答案 0 :(得分:5)
首先,这些差距完全很好。 没问题。只是你的强迫症会迫使你认为这些数字必须遵循一种模式 - 他们不这样做。
auto_increment
不是PHP功能,它是MySQL功能auto_increment
确保每一行都有唯一数字。它不涉及序号auto_increment
在并发环境中安全地工作 - 这意味着有很多用户连接到MySQL并做了一些事情,所有这些用户都必须能够处理数据库并且不能获得相同的id来识别一排。这是通过一个相当复杂的过程完成的,这是auto_increment
产生差距的原因之一auto_increment
被InnoDB
用于磁盘上记录的物理组织 - 它使用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)