Oracle自增字段生成21而非3的异常问题求助
Oracle自增字段(IDENTITY)跳号至21的原因与解决办法
问题场景
使用generated always as identity创建的自增ID字段,前两条插入生成1、2,第三条插入却直接跳到21,无法生成连续的序列值,影响静态参考表的ID连续性需求。
核心原因
Oracle的IDENTITY列底层依赖序列实现,而序列默认启用20个值的缓存(CACHE 20)。当出现以下情况时,缓存中未使用的序列值会被丢弃:
- 数据库实例重启
- 创建IDENTITY列的会话异常中断
- 事务回滚(仅未提交的缓存值会被丢弃)
你遇到的情况,大概率是在插入前两条数据后,会话中断或实例重启过,导致缓存里的3-20号值被废弃,下次插入直接从缓存的下一个起始值21开始。
解决办法
1. 创建表时直接指定NOCACHE
如果是新建表,在定义IDENTITY列时禁用缓存,确保序列值连续生成:
create table table1 ( id number(20) generated always as identity start with 1 increment by 1 nocache, -- 关键:禁用缓存 name varchar2(20) );
2. 修改已存在表的IDENTITY属性
如果表已经创建,可通过ALTER TABLE语句修改序列的缓存设置:
alter table table1 modify identity column id nocache;
3. 验证当前序列的缓存配置
可以通过查询数据字典视图,确认IDENTITY列关联的序列属性:
select sequence_name, cache_size, last_number from user_sequences where sequence_name like '%TABLE1%'; -- 表名对应的序列名通常带表名前缀
测试验证
修改后重新插入数据,就能得到连续的ID:
insert into table1(name) values('111'); insert into table1(name) values('222'); insert into table1(name) values('333'); select * from table1; -- 输出: 1 111 2 222 3 333
内容的提问来源于stack exchange,提问作者Jericho
相关产品推荐
相关产品推荐

