有一个数据库,ID做主键,每次取最大值加一做主键,但是当中间某几条数据被删除,则需要取被删的最小的值做主键。
例如:
表中有如下数据
ID Name
1 A
2 B
3 C
4 D
5 E
正常情况下,再插入一条数据,ID应该为6,但是假如插入第六条数据之前,ID为2和3 的数据被删除了,此时再插入,那么ID应该为2,而不是6,请问如何控制????
如果一定要做,可以将主键ID排序好放进数组,
然后 判断 a[i]-a[i-1]是否大于2,如果大于2,获得主键a[i-1] + 1
这分明是玩火嘛 8)
简单的办法,做个记录表,记录你删掉了的记录,然后每次用这张表的最小值,并删除。
咱不是搞算法的,有方法就可以了,更高级的不愿想了。 :D
为什么要这样利用主键ID呢?将主键定义为一个13位的数字,足够用了。
如果要达到你的要求,性能会急剧下降。
[quote]用户多的时候,几年就会不够用 [/quote]
1、利用UUID生成主键,保证不重复。
2、13位整数,代表一张表里面最多可以容纳9万亿条记录,如果
真的达到这么多条记录,这张表还能访问吗??真有这种场景
就要考虑分表。
ls+1
如我最初所说,lz在玩火,优化没有必要优化的细节。
自己定义规则随机+时间戳来产生Id
主键是一个标识,你已经赋予了实际意义。这样给你带来很多麻烦。
uuid就可以了。
[quote]项目中主键是8位日期+6位递增的序号组成[/quote]
这不是跟你原始描述的不一致了么? 8)
[quote]项目中主键是8位日期+6位递增的序号组成[/quote]
UUID(Universally Unique Identifier)全局唯一标识符,保证在同一时空中是唯一的。按照开放软件基金会(OSF)制定的标准计算,用到了网卡地址、纳秒时间、芯片ID码等许多可能数字。
由以下几部分组成,当前日期和时间、时钟序列、全局唯一的IEEE。
String uid = UUID.randomUUID().toString()
自己实现某种算法获得主键,往往都要加锁,就必然带来性能上的损耗,
同时也不利于维护,直接使用UUID,可以避免这方面的问题。