为什么用Oracle11g创建序列后插入数据的初始值老是从2开始?
Oracle新表使用序列(sequence)作为插入值,初始值不是第一个,即当我们创建了新的表(table)和序列(sequence),
在插入(insert)语句时,序列会跳过第一个值(1)。
所以结果是插入的序列值从 2(序列的第二个值) 开始, 而不是 1开始。
测试代码:
--建立测试表
CREATE TABLE GROUP_TEST(
ID NUMBER,
NAME VARCHAR2(10),
VALUE NUMBER,
REMARKS VARCHAR2(255)
);
--表注释(加注释是因为我对加注释的语句不熟悉。练习一下)
COMMENT ON TABLE GROUP_TEST IS '为了测试CUBE,ROLLUP,GROUPING,GROUPING_ID的区别';
COMMENT ON COLUMN GROUP_TEST.ID IS '序号';
COMMENT ON COLUMN GROUP_TEST.NAME IS '名字';
COMMENT ON COLUMN GROUP_TEST.VALUE IS '消费金额';
COMMENT ON COLUMN GROUP_TEST.REMARKS IS '备注';
--创建序列(序列之前都是用别人的。自己也建一个试试)
CREATE SEQUENCE SEQ_GROUP_TEST
INCREMENT BY 1 --每次+1
START WITH 1 --从1开始计数
MAXVALUE 999999999; --最大序列号为999999999
--插入数据[记得COMMIT哦;]
INSERT INTO GROUP_TEST VALUES(SEQ_GROUP_TEST.NEXTVAL,'tom',8,'生活用品');
INSERT INTO GROUP_TEST VALUES(SEQ_GROUP_TEST.NEXTVAL,'marry',9,'生活用品');
INSERT INTO GROUP_TEST VALUES(SEQ_GROUP_TEST.NEXTVAL,'lee',8,'生活用品');
INSERT INTO GROUP_TEST VALUES(SEQ_GROUP_TEST.NEXTVAL,'tom',9,'学习用品');
INSERT INTO GROUP_TEST VALUES(SEQ_GROUP_TEST.NEXTVAL,'marry',10,'学习用品');
INSERT INTO GROUP_TEST VALUES(SEQ_GROUP_TEST.NEXTVAL,'lee',15,'学习用品');
INSERT INTO GROUP_TEST VALUES(SEQ_GROUP_TEST.NEXTVAL,'tom',16,'生活用品');
INSERT INTO GROUP_TEST VALUES(SEQ_GROUP_TEST.NEXTVAL,'tom',8,'生活用品');
INSERT INTO GROUP_TEST VALUES(SEQ_GROUP_TEST.NEXTVAL,'tom',8,'生活用品');
INSERT INTO GROUP_TEST VALUES(SEQ_GROUP_TEST.NEXTVAL,'tom',8,'生活用品');
INSERT INTO GROUP_TEST VALUES(SEQ_GROUP_TEST.NEXTVAL,'tom',8,'生活用品');
INSERT INTO GROUP_TEST VALUES(SEQ_GROUP_TEST.NEXTVAL,'tom',8,'生活用品');
commit;
--查看插入的数据
SELECT * FROM GROUP_TEST;
想要解决这个问题有两种方法:
1.更改数据库的“延迟段创建”特性为false(需要有相应的权限)
ALTER SYSTEM SET deferred_segment_creation=FALSE;
2.在创建表时让seqment立即执行,如:
CREATE TABLE GROUP_TEST(
ID NUMBER,
NAME VARCHAR2(10),
VALUE NUMBER,
REMARKS VARCHAR2(255)
) SEGMENT CREATION IMMEDIATE;