如何解决主键的连续自增

解决方案是采用文件暂存的方式。
从1开始到99后重新归一循环。

public int getSeqNo() throws IOException {
int seqNo = 1;
File file = new File("seqNo");
if (!file.exists()) {
file.createNewFile();
} else {
Scanner in = new Scanner(new FileReader(file));
if (in.hasNextInt()) {
seqNo = in.nextInt();
if (seqNo < 99) {
seqNo++;
} else if (seqNo == 99) {
seqNo = 1;
}
}
in.close();
}

PrintWriter out = new PrintWriter("seqNo");
out.print(seqNo);
out.close();
return seqNo;
}
### 三级标题:MySQL 主键连续的常见原因及机制 MySQL 中主键(AUTO_INCREMENT)通常用于生成唯一且递的标识符,但在实际使用中,自值并不总是连续的。以下是一些导致自主键连续的主要原因及其实现机制。 #### 自主键的内存存储与持久化问题 在早期版本的 MySQL 中,自主键的值是保存在内存中的,并没有持久化到磁盘。这意味着如果数据库发生重启,自值可能会丢失并重新从某个默认值开始,这会导致新插入的数据行主键连续。这一问题在 MySQL 8.0 版本得到了解决,通过将自值持久化到 redo log 中,确保了即使在系统重启的情况下,也能恢复之前的自值 [^3]。 #### 插入操作失败或回滚 当一个事务尝试插入一条记录时,如果该事务最终被回滚或者插入操作失败,那么为这次插入分配的自 ID 将不会被重用。这样做的目的是为了保证事务的原子性和一致性,即使插入失败也不会释放已经分配的自 ID,从而导致自序列中出现空缺 [^1]。 #### 删除数据后的空隙 删除表中的某些记录也会造成自主键的不连续。当删除了具有特定自 ID 的记录后,这些 ID 并不会被再次使用来填充后续的新记录。因此,新的记录会继续使用下一个可用的自值,而不会填补已删除记录留下的空隙 [^2]。 #### 批量插入和并发控制 在执行批量插入时,MySQL 会预先分配一定数量的自 ID 给即将插入的所有记录。然而,如果其中部分记录由于约束冲突等原因未能成功插入,则未使用的自 ID 也不会被回收,这就造成了自序列中的跳跃现象 [^4]。 #### 自动长缓存机制 InnoDB 存储引擎采用了一种自动长缓存机制,它会在内存中维护当前最大的自 ID,并以此为基础进行分配。这种设计有助于提高性能,但也可能导致在某些情况下(如服务器意外关闭)无法保留最新的自状态,进而影响到自 ID 的连续性 [^3]。 综上所述,MySQL 自主键之所以可能不连续,主要是因为其内部实现方式以及对事务处理、故障恢复的支持需求。虽然不连续的自主键对于大多数应用场景来说是可以接受的,但对于那些需要严格连续编号的应用场景,则需要注意选择合适的配置和策略以减少此类情况的发生。 ```sql -- 示例:创建带有自主键的表 CREATE TABLE example_table ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255) ); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值