Oracle不能像MySQL那樣設置主鍵自增,Oracle用 <序列+觸發器>的方式使數據表的一列或多列實現自增
序列sequence+觸發器trigger:實現數據表S_DEPART中的主鍵的自增
PL/SQL圖示:
1、創建數據表,如下,DEPARTID是主鍵
2、創建序列Sequences
在oracle中sequence就是序列,每次取的時候它會自動增加。
sequence與表沒有關系,也就是,其他表都可以引用這個sequence
INCREMENT BY -- 每次加幾個
START WITH -- 從1開始計數
NOMAXvalue -- 不設置最大值
NOCYCLE -- 一直累加,不循環
CACHE 20; --設置緩存cache個序列,如果系統down掉了或者其它情況將會導致序列不連續,也可以設置為---------NOCACHE
CURRVAL=返回 sequence的當前值
NEXTVAL=增加sequence的值,然后返回 sequence 值(下一個sequence值)
或SQL語句
create sequence S_S_DEPART minvalue 1 maxvalue 99 start with 1 increment by 1 nocache;
然后執行如下sql語句,在S_Depart插入一條記錄,執行3次,看到DEPARTID實現了自增
insert into S_Depart(departId,Departname,Departorder)values(S_S_Depart.Nextval,'wang',1);
已經引用序列sequence實現了自增,
但是,當在表中手動添加記錄時,還是需要添加DEPARTID,因為建表時設置它是主鍵,not null
那么,怎么只輸入DEPARTNAME、 DEPARTORDER,然后保存、commit,實現DEPARTID引用sequence自增呢?
這時需要用到觸發器
3、創建觸發器的sql語句如下:
create or replace trigger tri_test_id before insert on S_Depart --S_Depart 是表名 for each row declare nextid number; begin IF :new.DepartId IS NULL or :new.DepartId=0 THEN --DepartId是列名 select S_S_DEPART.nextval --S_S_DEPART正是剛才創建的 into nextid from sys.dual; :new.DepartId:=nextid; end if; end tri_test_id;
此時,只輸入DEPARTNAME、 DEPARTORDER,然后保存、commit,
DEPARTID引用sequence實現了自增