create sequence SEQ_ID
minvalue 1
maxvalue 99999999
start with 1
increment by 1
cache 30
cycle
之后执行:
insert into tab (auto_id) values (SEQ_ID.Nextval)
备注:sequence 是一个自增长的序列,每次调用nextval的时候会自动增加,可以定义起始值,最大值,增量,cycle是表示循环,即到最大值后从起始值重新开始。 每次执行都是会自增的。
(1)不排除以前执行过或手动插入过记录的可能。(2)如果代码本身只是这么简单的代码,那我没看出来什么问题,如果代码并不是这么简单,那么就仔细检查一下代码,入股确定代码没有任何问题,那么我有了以下猜想。
(2)个人觉得很扯淡的一种解释(可能),你可以试验一下,未必是真的,但如果是真的,那就发现bug了
首先声明,我没试验过,仅仅是一种猜想,猜错了是绝对可能的,毕竟一般情况下怎么也不可能在最开始只添加一条数据。
在最开始(划重点)的一条数据来说,应该是两条数据。因为有两个值,一个是init起始值,一个是nextval值,也就是说序列最开始(划重点)插入时至少是有两条数据的,这也就解释了为什么你的编号1,2插入时是两条,其他值插入值为1条。至于以后添加的nextval值,则都是以当前值为基础的,所以不会出现这种情况。当然这种情况应该只会出现在起始值+只添加一条数据的情况下。(以上均为猜测,具体的要靠你的试验来证明)
想排除这种可能,只要再建立一张表,一个序列,最开始(起始值)还是像这样一样只插入一条,看看是不是两条,如果是两条,那么就说明这猜测可能是真的,如果是一条,那就应该是我的猜想错误。
虽然我也知道猜想好像很扯淡,但是不妨试试。
ORACLE中怎么设置SEQUENCE权限步骤如下:
1、Create Sequence
首先要有CREATE SEQUENCE或者CREATE ANY SEQUENCE权限。
创建语句如下:
CREATE SEQUENCE seqTest
INCREMENT BY 1 -- 每次加几个
START WITH 1 -- 从1开始计数
NOMAXvalue -- 不设置最大值
NOCYCLE -- 一直累加,不循环
CACHE 10 --设置缓存cache个序列,如果系统down掉了或者其它情况将会导致序列不连续,也可以设置为---------NOCACHE
2、得到Sequence值
定义好sequence后,你就可以用currVal,nextVal取得值。
CurrVal:返回 sequence的当前值
NextVal:增加sequence的值,然后返回 增加后sequence值
得到值语句如下:
SELECT Sequence名称.CurrVal FROM DUAL
如得到上边创建Sequence值的语句为:
select seqtest.currval from dual
在Sql语句中可以使用sequence的地方:
- 不包含子查询、snapshot、VIEW的 SELECT 语句
- INSERT语句的子查询中
- INSERT语句的values中
- UPDATE 的 SET中
如在插入语句中
insert into 表名(id,name)values(seqtest.Nextval,'sequence 插入测试')
3、Alter Sequence
拥有ALTER ANY SEQUENCE 权限才能改动sequence. 可以alter除start至以外的所有sequence参数.如果想要改变start值,必须 drop sequence 再 re-create。
4、Drop Sequence
DROP SEQUENCE seqTest
5、一个例子
create or replace trigger tri_test_id
before insert on S_Depart --S_Depart 是表名
for each row
declare
nextid number
begin
IF :new.DepartId IS NULLor :new.DepartId=0 THEN --DepartId是列名
select SEQ_ID.nextval --SEQ_ID正是刚才创建的
into nextid
from sys.dual
:new.DepartId:=nextid
end if
end tri_test_id
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)