1. 程式人生 > 其它 >oracle實現自增主鍵

oracle實現自增主鍵

Oracle沒有這個”auto_increment”屬性,所以它沒法像MySQL般在表內定義自增主鍵。但是,Oracle裡的序列(SEQUENCE),可間接實現自增主鍵的作用。

序列(Sequence),又叫序列生成器,用於提供一系列的數字,開發人員使用序列生成唯一鍵。每次訪問序列,序列按照一定的規律增加或者減少。 序列的定義儲存在SYSTEM表空間中,序列不像表,它不會佔用磁碟空間。 序列獨立於事務,每次事務的提交和回滾都不會影響序列。

建立的方法及引數說明如下:

CREATE SEQUENCE T_USER_SEQ
MINVALUE 1 
NOMAXVALUE 
INCREMENT BY 1 
START WITH 1 
NOCACHE;
  1. T_USER_SEQ:序列名
  2. MINVALUE :最小值;設定 NOMINVALUE 表示無最小值  
  3. NOMAXVALUE: 表示無最大值  
  4. INCREMENT BY 1 :每次自增1, 也可寫非0的任何整數,表示自增,或自減
  5. START WITH 1:以該值開始自增或自減  
  6. NOCACHE :不快取序列;也可以指定可以快取 20 個值在記憶體裡,則寫CACHE 20 

 USER表的建立語句如下:

 CREATE TABLE USER
 (  
     ID INT PRIMARY KEY,  
    NAME VARCHAR2(40) NULL,  
     AGE VARCHAR2(40) NULL  
 );    

插入時:

insert into user(ID,NAME,AGE)values(T_USER_SEQ.NEXTVAL,"張三","18") 

但是這樣還是會有一些麻煩,T_USER_SEQ.NEXTVAL 這一步可以省掉嗎?像mysql主鍵一樣插入新紀錄時用不著考慮自增,可以使用觸發器

建立觸發器的方法及引數說明如下:

create or replace trigger T_USER_SEQ_TRIGGER /*觸發器名稱*/
before insert on USER /*觸發條件:當向表user執行插入操作時觸發此觸發器*/
for each row /*對每一行都檢測是否觸發*/
begin /*觸發器開始*/
select T_USER_SEQ.nextval into :new.ID from dual;/*觸發器主體內容,即觸發後執行的動作,在此是取得序列T_USER_SEQ的下一個值插入到表user中的id欄位中*/
end T_USER_SEQ_TRIGGER;/*觸發器結束*/

插入資料:

insert into user(ID,NAME,AGE)values(null,"張三","18"); /*方式一*/
insert into user(NAME,AGE)values("張三","18"); /*方式二*/