oracle實現自增主鍵
阿新 • • 發佈:2022-03-17
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"); /*方式二*/