標籤:
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_DEPARTminvalue 1maxvalue 99start with 1increment by 1nocache;
然後執行如下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 rowdeclare 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實現了自增
Oracle實現自增方式:序列+觸發器