oracle sequence的簡單介紹(自增加字段)

例子 :create sequence S_A_EventID increment by 1 start with 34 maxvalue 999999999;
在oracle中sequence就是所謂的序列號,每次取的時候它會自動增長,通常用在須要按序列號排序的地方。
一、Create Sequence
你首先要有CREATE SEQUENCE或者CREATE ANY SEQUENCE權限,
CREATE SEQUENCE emp_sequence
INCREMENT BY 1 -- 每次加幾個
START WITH 1 -- 從1開始計數
NOMAXVALUE -- 不設置最大值
NOCYCLE -- 一直累加,不循環
CACHE 10;sql

一旦定義了emp_sequence,你就能夠用CURRVAL,NEXTVAL
CURRVAL=返回 sequence的當前值
NEXTVAL=增長sequence的值,而後返回 sequence 值數據庫

好比:
emp_sequence.CURRVAL
emp_sequence.NEXTVALoracle

可使用sequence的地方:ide

  • 不包含子查詢、snapshot、VIEW的 SELECT 語句設計

  • INSERT語句的子查詢中
  • NSERT語句的VALUES中
  • UPDATE 的 SET中

能夠看以下例子:
INSERT INTO emp VALUES
(empseq.nextval, 'LEWIS', 'CLERK',7902, SYSDATE, 1200, NULL, 20);
SELECT empseq.currval FROM DUAL;3d

可是要注意的是:blog

  • 第一次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 再 re-create .
Alter sequence 的例子
ALTER SEQUENCE emp_sequence
INCREMENT BY 10
MAXVALUE 10000
CYCLE -- 到10000後從頭開始
NOCACHE ;
影響Sequence的初始化參數:
SEQUENCE_CACHE_ENTRIES =設置能同時被cache的sequence數目。
能夠很簡單的Drop Sequence
DROP SEQUENCE order_seq;
好吧,就到這裏。

自增加及觸發器:
如何在Oracle 中實現相似自動增長 ID 的功能?
整理編輯:China ASP
咱們常常在設計數據庫的時候用一個系統自動分配的ID來做爲咱們的主鍵,可是在ORACLE 中沒有這樣的
功能,咱們能夠經過採起如下的功能實現自動增長ID的功能
1.首先建立 sequence
create sequence seqmax increment by 1
2.使用方法
select seqmax.nextval ID from dual
就獲得了一個ID
若是把這個語句放在 觸發器中,就能夠實現和ms sql 的自動增長ID相同的功能!

由 macro 發佈於: 2001-04-13 14:44
做者:Macro Zeng排序

建表

CREATE TABLE "SPORTS"."LINEUP"("ID" NUMBER NOT NULL, "TYPE"
NUMBER(3) NOT NULL, "BODY" VARCHAR2(100) NOT NULL, "HITS" NUMBER(
10) DEFAULT 0 NOT NULL, PRIMARY KEY("ID"))
TABLESPACE "TS_SPORTS"內存

建序列

CREATE SEQUENCE "SPORTS"."SPORTS_LINEUP_ID_SEQ" INCREMENT BY 1
START WITH 1 MAXVALUE 1.0E28 MINVALUE 1 NOCYCLE
CACHE 50 NOORDERrem

建自動更新的觸發器

CREATE OR REPLACE TRIGGER "SPORTS"."SPORTS_LINEUP_ID_TRIGGER"
BEFORE INSERT
ON "SPORTS"."LINEUP"
FOR EACH ROW
DECLARE
next_id NUMBER;
BEGIN
--Get the next id number from the sequence
SELECT sports_lineup_id_seq.NEXTVAL
INTO next_id
FROM dual;
--Use the sequence number as the primary key
--for the record being inserted.
:new.id := next_id;
END;

建保護 PRIMARY KEY 的觸發器

CREATE OR REPLACE TRIGGER "SPORTS"."LINEUP_ID_UPDATE_TRIGGER"
BEFORE UPDATE OF "ID" ON "SPORTS"."LINEUP"
FOR EACH ROW
BEGIN
RAISE_APPLICATION_ERROR (-20000,
'sports_lineup_id_update_trigger : Updates of the ID field'
|| 'are not allowed. ');
END

雖然這個保護 PRIMARY KEY 的觸發器圖標有個叉叉,並且,執行更新自增加字段語句報錯了,可是,仍是阻止了其更新。若是刪掉此觸發器,則能夠更新成功。
oracle sequence的簡單介紹(自增加字段)

相關文章
相關標籤/搜索