Oracle沒有這個”auto_increment”屬性,所以它沒法像MySQL般在表內定義自增主鍵。但是,Oracle里的序列(SEQUENCE),可間接實現自增主鍵的作用。
序列(Sequence),又叫序列生成器,用於提供一系列的數字,開發人員使用序列生成唯一鍵。每次訪問序列,序列按照一定的規律增加或者減少。序列的定義存儲在SYSTEM表空間中,序列不像表,它不會占用磁盤空間。序列獨立於事務,每次事務的提交和回滾都不會影響序列。
創建的方法及參數說明如下:
CREATE SEQUENCE T_USER_SEQ MINVALUE 1 NOMAXVALUE INCREMENT BY 1 START WITH 1 NOCACHE;
- T_USER_SEQ:序列名
- MINVALUE :最小值;設置 NOMINVALUE 表示無最小值
- NOMAXVALUE: 表示無最大值
- INCREMENT BY 1 :每次自增1, 也可寫非0的任何整數,表示自增,或自減
- START WITH 1:以該值開始自增或自減
- 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" ); /*方式二*/