oracle的自增需要依靠序列和觸發(fā)器共同實(shí)現(xiàn)
創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),伊寧企業(yè)網(wǎng)站建設(shè),伊寧品牌網(wǎng)站建設(shè),網(wǎng)站定制,伊寧網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷,網(wǎng)絡(luò)優(yōu)化,伊寧網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
比如
先創(chuàng)建一個(gè)表
create?table?test(id?int?primary?key,
name?varchar2(10));
創(chuàng)建一個(gè)序列
create?sequence?test_seq?
increment?by?1?
start?with?1?
minvalue?1?
maxvalue?9999999999999?
nocache?
order;
觸發(fā)器實(shí)現(xiàn)
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?('張三');
兩個(gè)方法:
1,重新創(chuàng)建一個(gè)表,然后創(chuàng)建一個(gè)序列,把老數(shù)據(jù)導(dǎo)入新表,刪除老表,修改新表名字為老表
2,直接在原來表上增加一個(gè)字段,創(chuàng)建一個(gè)序列,通過更新的方式修改老數(shù)據(jù)的這個(gè)字段。
具體操作主要是2點(diǎn),首先是創(chuàng)建一個(gè)序列名sequence;
然后是,insert語句的時(shí)候:將自增的字段的位置,寫成序列名.nextval。
從創(chuàng)建表開始,然后創(chuàng)建sequence,到insert語句
1.首先創(chuàng)建表
CREATE TABLE "FLOWCAL"."T_USERINFO"
( "C_ID" NUMBER(*,0),
"C_USER" VARCHAR2(20 BYTE),
"C_PASSWORD" VARCHAR2(20 BYTE),
"C_ROLE" VARCHAR2(20 BYTE),
"C_COMMENT1" VARCHAR2(20 BYTE),
"C_COMMENT2" VARCHAR2(20 BYTE)
)
現(xiàn)在想讓C_ID自增一。
2.首先創(chuàng)建一個(gè)oracle的sequence,sql語句如下:
create sequence 序列名
increment by 1
start with 1
maxvalue 999999999
cycle;
建立一個(gè)最小為1,最大為999999999的一個(gè)序列號(hào)會(huì)自動(dòng)循環(huán)的序列
下面的sequence,如下:
CREATE SEQUENCE "FLOWCAL"."SEQ_USERINFO"
MINVALUE 0
MAXVALUE 9999999999999999999999999999
INCREMENT BY 1
START WITH 24
CACHE 20
ORDER
CYCLE ;
3.通過序列名.nextval實(shí)現(xiàn)插入時(shí),字段的自增一
當(dāng)向表中插入數(shù)據(jù)時(shí),SQL語句寫法如下:
SQL insert into 表名 values(,列1值,列2值,....);
"序列名"可以替換為自己需要的名字.
下面insert語句:
insert into T_USERINFO values(SEQ_USERINFO.NEXTVAL,'111','11','11','11','11')
在oracle中sequence就是所謂的序列號(hào),每次取的時(shí)候它會(huì)自動(dòng)增加,一般用在需要按序列號(hào)排序的地方。
1、createsequence
你首先要有createsequence或者createanysequence權(quán)限,
createsequenceemp_sequence
incrementby1--每次加幾個(gè)
startwith1--從1開始計(jì)數(shù)
nomaxvalue--不設(shè)置最大值
nocycle--一直累加,不循環(huán)
cache10;
一旦定義了emp_sequence,你就可以用currval,nextval
currval=返回sequence的當(dāng)前值
nextval=增加sequence的值,然后返回sequence值
比如:
emp_sequence.currval
emp_sequence.nextval
可以使用sequence的地方:
-不包含子查詢、snapshot、view的select語句
-insert語句的子查詢中
-nsert語句的values中
-update的set中
可以看如下例子:
insertintoempvalues
(empseq.nextval,'lewis','clerk',7902,sysdate,1200,null,20);
selectempseq.currvalfromdual;
但是要注意的是:
-第一次nextval返回的是初始值;隨后的nextval會(huì)自動(dòng)增加你定義的incrementby值,然后返回增加后的值。currval總是返回當(dāng)前sequence的值,但是在第一次nextval初始化之后才能使用currval,否則會(huì)出錯(cuò)。一次nextval會(huì)增加一次sequence的值,所以如果你在同一個(gè)語句里面使用多個(gè)nextval,其值就是不一樣的。明白?
-如果指定cache值,oracle就可以預(yù)先在內(nèi)存里面放置一些sequence,這樣存取的快些。cache里面的取完后,oracle自動(dòng)再取一組到cache。使用cache或許會(huì)跳號(hào),比如數(shù)據(jù)庫(kù)突然不正常down掉(shutdownabort),cache中的sequence就會(huì)丟失.所以可以在createsequence的時(shí)候用nocache防止這種情況。
2、altersequence
你或者是該sequence的owner,或者有alteranysequence權(quán)限才能改動(dòng)sequence.可以alter除start至以外的所有sequence參數(shù).如果想要改變start值,必須dropsequence再re-create.
altersequence的例子
altersequenceemp_sequence
incrementby10
maxvalue10000
cycle--到10000后從頭開始
nocache;
影響sequence的初始化參數(shù):
sequence_cache_entries=設(shè)置能同時(shí)被cache的sequence數(shù)目。
可以很簡(jiǎn)單的dropsequence
dropsequenceorder_seq;
CREATE SEQUENCE emp_sequence -- emp_sequence這個(gè)就是后面要用到這個(gè)序列號(hào)時(shí)引用的名稱
INCREMENT BY 1 -- 每次加幾個(gè)
START WITH 1 -- 從1開始計(jì)數(shù)
NOMAXVALUE -- 不設(shè)置最大值
NOCYCLE -- 一直累加,不循環(huán)
CACHE 100; -- 緩存值 100
當(dāng) 需要使用該序列號(hào)的值時(shí),直接調(diào)用創(chuàng)建的序號(hào)號(hào)中的 nextval方法。
如: emp_sequence.nextval (注意:后面沒有括號(hào),它是一個(gè)屬性值)
刪除序列
DROP SEQUENCE emp_sequence;