2014-09-01 65 views
0

嗨我正在使用Java和SQL(XAMPP)处理项目数据库。如何为自动递增主键生成下一个值

为什么“ID”不会增加到下一个可用值。请注意,我从2-8删除了所有连续的数字。和“ID”有A_I(自动增量)。

ID  username password fname mname lname course address contact status 

1  31231231 123  new old smith BSCS 123  123 USER 

9  123  ASD  ASD ASD ASD BSCpE ASD  123 USER 

为什么它是(1,9)不是(1,2)?

+0

''我从2-8删除了一些连续的数字'' - 它看起来像是从2-8删除了所有*记录。如果你删除了它们,你为什么期望它们仍然显示在你的查询中? – David 2014-09-01 15:09:19

+0

对不起,这是一个错字。 – Starvinmarvinnn 2014-09-01 15:27:51

回答

3

你回答了你的问题。您在2-8之间删除了数字。

所以它是一个MySQL数据库,自动增量不会增加基于列的最大值的数量。

想一想。计算表中的最大数量并将其增加到下一个记录的效率会低得多。

取而代之的是记下某个地方在该列上使用的最后一个数字,并且在请求一个新数字时增加该数字会更加有效。

我不是MySQL大师,但MySQL显然使用内部机制作为序列来增加列值。

如果删除一个非连续的数字,那就太好了。事实上,我认为在大多数情况下,这是可取的。保持原状。只要这些数字是独一无二的,那为什么还要打扰你呢?

+0

我明白了,我对sql很陌生,这就是为什么我冒险去冒险的原因。感谢您的澄清。这只是让我很难看到(1,6,8,9 ..)比(1,2,3,4 ..)。它会影响任何东西吗?或者,除非它会,如果我包含“ID”的列是正确的? – Starvinmarvinnn 2014-09-01 15:11:16

+3

重复使用一个数字不仅“效率低下”,而是非常危险。标识符的意思是,确定一些东西。如果两个不同的对象不完全相同,即使其中一个不再存在,也不应该具有相同的标识符。 – David 2014-09-01 15:11:18

+1

@Starvinmarvinnn:从长远来看,如果您的标识符不是唯一的,它最终会打扰您*更多*。 – David 2014-09-01 15:11:57

1

由于(a)删除,或(b)从未提交的事务内部生成的ID,数字可能不连续。

其他答案指出了重用ID的一些问题。最大的问题是当一个ID在与原始数据库的一致性边界之外的另一个系统(即复制到另一个SQL Server数据库,或通过集成中间件到冗长系统)共享后再次使用时发生的情况。

底线:不要重复使用ID。