Oracle在第一次插入创建的默认序列时,序列值是2的问题?
首先创建一张新表,创建序列,然后插入一条数据,查询表第一次使用序列作为主键的插入值是2。
DROP TABLEemp_xxw;
CREATE TABLEemp_xxw (
empno NUMBER(8) PRIMARY KEY,
ename VARCHAR(20),
JOB VARCHAR(20),
mgr NUMBER(8),
hiredate DATE,
sal NUMBER(11,2),
comm NUMBER(11,2),
deptno NUMBER(8)
);
DROP SEQUENCE emp_xxw_seq;
CREATE SEQUENCE emp_xxw_seq;
INSERT INTO emp_xxw VALUES(emp_xxw_seq.nextval,
'张三','领导',0,SYSDATE,18000.0,3000.0,1);
SELECT * FROMemp_xxw;
顺便说一下,序列的第一次使用是不能用CURRVAL的,第一次插入为何不是1呢?
原因:从Oracle 11.2.0.1开始,提供了一个"延迟段创建"特性,即:在做上述插入时,序列会跳过第一个值(1),从而插入的是2.
解决方案有两种:
1、更改数据库的"延时段创建"特性为false(需要相应的权限)
ALTER SYSTEMSET deferred_segment_creation = FALSE;
2、创建表时让序列立即执行,如:
DROP TABLEemp_xxw;
CREATE TABLEemp_xxw (
empno NUMBER(8) PRIMARY KEY,
ename VARCHAR(20),
JOB VARCHAR(20),
mgr NUMBER(8),
hiredate DATE,
sal NUMBER(11,2),
comm NUMBER(11,2),
deptno NUMBER(8)
) SEGMENT CREATION IMMEDIATE;
简单的介绍到这里,如有需要查证细节考参考其他帖子。