一個問題:
在某張表中,存在一個id列(整數),我們希望在添加記錄的時候,該列從1開始,自動的增長,怎么處理?
解決方式:oracle是利用“序列”(sequence)來完成的。
序列(sequence)介紹
oracle中,是通過使用序列(sequence)來處理自動增長列。
(1)可以為表中的列自動產生值。
(2)由用戶創建數據庫對象,並可由多個用戶共享。
(3)一般用於主鍵或唯一列。
創建序列基本語法:
create sequence 序列名稱
start with 開始數字
increment by 增長數字
minvalue 最小值
maxvalue 最大值
cycle
nocache
詳細說明:
start with 開始數字à從幾開始
increment by 增長à步長,每次增長幾個數
minvalue 最小值
maxvalue 最大值à可以不設置,不設置應寫為nomaxvalue,也就是無窮大
cycle 循環,也就是說當長增長到最大值后,再從最小值開始重新增長
nocache 不設緩存
案例說明:
create sequence my_seq --創建序列名
start with 1 --從1開始
increment by 1 --每次增長1
maxvalue 999999999 --最大值 //nomaxvalue(不設置最大值)
minvalue 1 --最小值
cycle --循環 //nocycle(一直累加,不循環)
nocache --不使用緩存
解釋:從1開始,每次增長1,最大值999999999,之后循環從1開始。
create sequence myseq
start with 0
increment by 1
minvalue 0
nomaxvalue
nocycle
nocache;
解釋:從0開始,每次增長1,最小值0,無窮大,不循環一直累加。
sequence的使用:
create table test1(id number primary key,name varchar2(32));
insert into test1 values(myseq.nextval,'abc');
insert into test1 values(myseq.nextval,'ddd');
特別說明:
1、myseq:表示序列的名字,nextval:關鍵字,表示從序列中取下一個值。
2、sequence序列是需要配合number類型的列來使用;
3、sequence序列是要在主鍵或unique列上使用的。
問題:
如果system用戶使用scott的sequence的序列時,sequence是從1增長還是從已使用到的數字開始?
答案:是從已使用到的數字接着增長。
細節說明:
看例子:
insert into emp values(my_seq.nextval,'tomcat','clerk',7566,sysdate,1200,null,20);
select my_seq.currval from dual;
注意:
第一次使用nextval返回的是初始值;
隨后的nextval會自動增加你定義的increment by值,然后返回增加后的值;
currval總是返回當前sequence的值,但是在第一次nextval初始化之后才能使用currval,否則會出錯。
使用一次nextval會增加一次sequence的值,所以如果你在同一個語句里面使用多個nextval,其值就是不一樣的。
如果指定cache值,oracle就可以預先在內存里面放置一些sequence,這樣存取的快些。cache里面的取完后,oracle自動再取一組到cache。使用cache或許會跳號,比如數據庫突然不正常down掉(shotdown abort),cache中的sequence就會丟失,所以可以在create sequence的時候用nocache防止這種情況。
一旦定義了某個序列,你就可以用currval,nextval
currval:返回sequence的當前值
nextval:增加sequence的值,然后返回sequence值。
比如:
序列名.crrval
序列名.nextval
什么時候使用sequence?
不包含子查詢、snapshot/view的select的語句
insert語句的子查詢中
insert語句的values中
update的set中
如:update 表名 列值=序列名.nextval where 條件;
在sqlserver和mysql中都可以在定義表的時候,直接給指定自增長。
sqlserver中設置自增長
create table 表名(id int primary key identity(1,1),name varchar(32));
mysql中設置自增長
create table 表名(id int primary key auto_incrment,name varchar(32));