熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

oracle數據庫如何創建自增列的技巧教程

2013-11-13 22:25:26  來源: Oracle 

  Oracle沒有自增字段這樣的功能但是通過觸發器(trigger)和序列(sequence)可以實現

  先建一個測試表了

  create table userlogin
(

  id   number() not null

  name   varchar()   not null primary key

  )

  tablespace users

  第一步創建SEQUENCE

  
create sequence userlogin_seq increment by start with minvalue maxvalue nocache order;

  
第二步創建一個基於該表的before insert 觸發器在觸發器中使用剛創建的SEQUENCE

  
create or replace trigger userlogin_trigger
before insert on userlogin
for each row
begin
      select   userlogin_seqnextval   into:newid from sysdual ;
end;

  第三步在userlogin表中測試

  寫個insert語句插入一條記錄看ID字段自增了沒自增則OK啦 

  
oracle沒有ORACLE自增字段這樣的功能但是通過觸發器(trigger)和序列(sequence)可以實現

  先建一個測試表了

  create table userlogin
(

  id   number() not null

  name   varchar()   not null primary key

  )

  tablespace users

  /

  
第一步創建SEQUENCE

  
create sequence userlogin_seq increment by start with minvalue maxvalue nocache order;

  
第二步創建一個基於該表的before insert 觸發器在觸發器中使用剛創建的SEQUENCE

  
create or replace trigger userlogin_trigger
before insert on userlogin
for each row
begin
      select   userlogin_seqnextval   into:newid from sysdual ;
end;

  /

  
第三步在userlogin表中測試

  寫個insert語句插入一條記錄看ID字段自增了沒自增則OK啦   

  
Oracle序列知識

  在oracle中sequence就是所謂的序列號每次取的時候它會自動增加一般用在需要按序列號排序的地方
Create Sequence
你首先要有CREATE SEQUENCE或者CREATE ANY SEQUENCE權限
CREATE SEQUENCE emp_sequence
INCREMENT BY 每次加幾個
START WITH 開始計數
NOMAXVALUE 不設置最大值
NOCYCLE 一直累加不循環
CACHE ;

  一旦定義了emp_sequence你就可以用CURRVALNEXTVAL
CURRVAL=返回 sequence的當前值
NEXTVAL=增加sequence的值然後返回 sequence 值
比如
emp_sequenceCURRVAL
emp_sequenceNEXTVAL

  可以使用sequence的地方
不包含子查詢snapshotVIEW的 SELECT 語句
INSERT語句的子查詢中
NSERT語句的VALUES中
UPDATE 的 SET中

  可以看如下例子
INSERT INTO emp VALUES
(empseqnextval LEWIS CLERK SYSDATE NULL );

  SELECT empseqcurrval FROM DUAL;

  但是要注意的是
第一次NEXTVAL返回的是初始值隨後的NEXTVAL會自動增加你定義的INCREMENT BY值然後返回增加後的值CURRVAL 總是返回當前SEQUENCE的值但是在第一次NEXTVAL初始化之後才能使用CURRVAL否則會出錯一次NEXTVAL會增加一次 SEQUENCE的值所以如果你在同一個語句裡面使用多個NEXTVAL其值就是不一樣的明白?

   如果指定CACHE值ORACLE就可以預先在內存裡面放置一些sequence這樣存取的快些cache裡面的取完後oracle自動再取一組 到cache 使用cache或許會跳號 比如數據庫突然不正常down掉(shutdown abort)cache中的sequence就會丟失 所以可以在create sequence的時候用nocache防止這種情況

  Alter Sequence
你或者是該sequence的owner或者有ALTER ANY SEQUENCE 權限才能改動sequence 可以alter除start至以外的所有sequence參數如果想要改變start值必須 drop sequence 再 recreate
Alter sequence 的例子
ALTER SEQUENCE emp_sequence
INCREMENT BY
MAXVALUE
CYCLE 後從頭開始
NOCACHE ;

  
影響Sequence的初始化參數
SEQUENCE_CACHE_ENTRIES =設置能同時被cache的sequence數目

  可以很簡單的Drop Sequence
DROP SEQUENCE order_seq;


From:http://tw.wingwit.com/Article/program/Oracle/201311/19077.html
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.