欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Oracle产生的序列总是从2开始是怎么回事?

程序员文章站 2023-01-28 13:37:01
用oracle11g创建序列后插入数据的初始值老是从2开始 oracle新表使用序列(sequence)作为插入值,初始值不是第一个, oraclesequence 1 --创建测试表--...

oracle11g创建序列后插入数据的初始值老是从2开始

oracle新表使用序列(sequence)作为插入值,初始值不是第一个,

oraclesequence

 1 --创建测试表--
 2 create table tbl_test(
 3         test_id number primary key,
 4         test_name varchar2(20)
 5  );
 6  
 7  --为tbl_test创建序列--
 8 create sequence seq_test
 9      increment by 1 -- 每次加几个
10      start with 1 -- 从1开始计数
11  ;
12  
13  --插入测试数据--
14  insert into tbl_test values(seq_test.nextval,'测试');
15  commit;
16  
17  --查询表中的数据
18  select * from tbl_test;

问题原因:

·当我们使用序列作为插入数据时,如果使用了“延迟段”技术,则跳过序列的第一个值

·oracle从 11.2.0.1版本开始,提供了一个“延迟段创建”特性:

当我们创建了新的表(table)和序列(sequence),

在插入(insert)语句时,序列会跳过第一个值(1)。

所以结果是插入的序列值从2(序列的第二个值) 开始,而不是1开始。

想要解决这个问题有两种方法:

更改的“延迟段创建”特性为false(需要有相应的权限)

1 alter system set deferred_segment_creation=false;

或者

在创建表时让seqment立即执行,如:

1 create table tbl_test(
2     test_id number primary key, 
3     test_name varchar2(20)
4 )
5  segment creation immediate;