You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 03:04:59