十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
oracle的自增需要依靠序列和触发器共同实现
创新互联公司是一家专注于成都网站建设、成都网站制作与策划设计,波密网站建设哪家好?创新互联公司做网站,专注于网站建设十多年,网设计领域的专业建站公司;建站业务涵盖:波密等地区。波密做网站价格咨询:18982081108
比如
先创建一个表
create table test(id int primary key,
name varchar2(10));
创建一个序列
create sequence test_seq
increment by 1
start with 1
minvalue 1
maxvalue 9999999999999
nocache
order;
触发器实现
create or replace trigger test_trigger
before insert on testfor each row
begin
select test_seq.Nextval into:new.id from dual;
end;
然后你试试吧
insert into test (name) values ('张三');
oracle
中不能设置自动增加,这个和其他数据库不一样,但是有
序列,这个是Oracle自己特有的东西,
首先创建序列:
create
sequence
seq;
这就创建好了,然后
seq.nextval
就会返回一个值,不会重复的值,
insert
into
tablename
values(seq.nextval,'001','javabook');
insert
into
tablename
values(seq.nextval,'001','javabook');
insert
into
tablename
values(seq.nextval,'001','javabook');
看明白没?这样前3个id
分别是
1,2,3
这里Oracle数据库使用命令行操作,注意Oracle不能直接设置自增字段,需要使用序列+触发器来实现。
1.创建Book表
Create table Book(
Id NUMBER(6) constraint s_PK primary key,
Title nvarchar2(200) not null,
Author nvarchar2(200) not null,
Publisher nvarchar2(200) not null,
ISBN nvarchar2(50) not null,
Price NUMBER(6,2) not null,
CategoryName nvarchar2(50) not null,
Description nvarchar2(1000) not null,
ImageName varchar2(50)
);
2.创建自增序列
create sequence BOOK_seq (BOOK_seq为序列名,任意取)
increment by 1 (increment 表示字段逐条增加1)
start with 1 (设置自增序列的初始值为1)
nomaxvalue (不限制自增序列的最大值)
minvalue 1; (设置自增序列的最小值为1)
3.试用一下,向BOOK表中插入一条数据,Id列就引用了自增序列。
insert into BOOK values(BOOK_seq.nextval,'a','a','a','a',32.1,'a',
'a','1.jpg');
注意:
操作之后记得输入“commit;“保存操作。
Oracle数据库的的命令行创建表,系统会自动转化为大写字母,假如使用数据库操作客户端,那么建表等操作时记得字段名大写。
将表t_uaer的字段ID设置为自增:(用序列sequence的方法来实现)----创建表Create table t_user(
Id number(6),userid varchar2(20),loginpassword varchar2(20),isdisable number(6));----创建序列
create sequence user_seq
increment by 1
start with 1nomaxvaluenominvaluenocache----创建触发器
create or replace trigger tr_user
before insert on t_popedom_user
for each rowbeginselect user_seq.nextval into :new.id from dual;end;----测试insert into t_popedom_user(userid,loginpassword, isdisable)
values('ffll','liudddyujj', 0);
insert into t_popedom_user(userid,loginpassword, isdisable)
values('dddd','zhang', 0)
select * from t_user;
就可以看出结果。
***********************************************************************
对sequence说明:
increment by :用于指定序列增量(默认值:1),如果指定的是正整数,则序列号自动递增,如果指定的是负数,则自动递减。
start with :用于指定序列生成器生成的第一个序列号,当序列号顺序递增时默认值为序列号的最小值 当序列号顺序递减时默认值为序列号的最大值。
Maxvalue:用于指定序列生成器可以生成的组大序列号(必须大于或等于start with,并且必须大于minvalue),默认为nomaxvalue。
Minvalue:用于指定序列生成器可以生成的最小序列号(必须小于或等于starr with,并且必须小于maxvalue),默认值为nominvalue。
Cycle:用于指定在达到序列的最大值或最小值之后是否继续生成序列号,默认为nocycle。
Cache:用于指定在内存中可以预分配的序列号个数(默认值:20)。
在sequence中应注意:
1、 第一次NEXTVAL返回的是初始值;随后的NEXTVAL会自动增加你定义的INCREMENT BY值,然后返回增加后的值。CURRVAL 总是返回当前SEQUENCE的值,但是在第一次NEXTVAL初始化之后才能使用CURRVAL,否则会出错。一次NEXTVAL会增加一次SEQUENCE的值,所以如果你在同一个语句里面使用多个NEXTVAL,其值就是不一样的。
2、 如果指定CACHE值,ORACLE就可以预先在内存里面放置一些sequence,这样存取的快些。cache里面的取完后,oracle自动再取一组到cache。 使用cache或许会跳号, 比如数据库突然不正常down掉(shutdown abort),cache中的sequence就会丢失. 所以可以在create sequence的时候用nocache防止这种情况。
关键字:自增 sequence序列 increment start with