1. 程式人生 > >Oracle用觸發器實現插入資料主鍵自增

Oracle用觸發器實現插入資料主鍵自增

一篇:
首先,你要有一張表!
CREATE TABLE example(
ID Number(4) NOT NULL PRIMARY KEY,
NAME VARCHAR(25),
PHONE VARCHAR(10),
ADDRESS VARCHAR(50));

然後,你需要一個自定義的sequence
CREATE SEQUENCE emp_sequence
INCREMENT BY 1 -- 每次加幾個
START WITH 1 -- 從1開始計數
NOMAXVALUE -- 不設定最大值
NOCYCLE -- 一直累加,不迴圈
NOCACHE -- 不建緩衝區
以 上程式碼完成了一個序列(sequence)的建立過程,名稱為emp_sequence,範圍是從1開始到無限大(無限大的程度是由你機器決定 的),nocycle 是決定不迴圈,如果你設定了最大值那麼你可以用cycle 會使seq到最大之後迴圈.對於nocache順便說一下如果你給出了cache值那麼系統將自動讀取你的cache值大小個seq,這樣在反覆操作時會加快執行速度,但如果遭遇意外情況如當機了或Oracle死了,則下次取出的seq值將和上次的不連貫.(如果連不連貫無所謂建議用cache,因為時間就是金錢呀!跑題了!)

你只有了表和序列還不夠,還需要一個觸發器來執行它!程式碼如下:
CREATE TRIGGER "觸發器名稱" BEFORE
INSERT ON example FOR EACH ROW WHEN (new.id is null)
begin
select emp_sequence.nextval into: new.id from dual;
end;
打完收工!下面你就試試插入資料吧!

另一篇:

學oracle不久,在建表時發現這樣一個問題,比如我現在建立一個表:student

create table STUDENT
(
ID NUMBER not null,
NAME VARCHAR2(20) default '男',
SEX VARCHAR2(4),
ADDRESS VARCHAR2(40),
MEMO VARCHAR2(60)
)

現在我想實現每插入一條資料,就讓id自動增長1.在SQLSERVER中這個很好實現,但在oracle中我搞了半天,查了下資料發現要用到“序列(sequence)”,“觸發器”的知識。

首先,建立一個序列:

create sequence STU
minvalue 1
maxvalue 999999999999
start with 21
increment by 1
cache 20;

然後,給表student建立一個觸發器:

create or replace trigger stu_tr
before insert on student
for each row
declare
-- local variables here
begin
select stu.nextval into :new.id from dual;
end stu_tr;

*******************************************************************************************************************************

下面用一個例子來說明自增主鍵的建立:

1、建使用者資料表
      drop table dectuser;
      create table dectuser(
           userid integer primary key, /*主鍵,自動增加*/
           name varchar2(20),
          sex varchar2(2)
           );

2、建立自動增長序列
      drop sequence dectuser_tb_seq;
      create sequence dectuser_tb_seq minvalue 1 maxvalue 99999999
               increment by 1
               start with 1;   /*步長為1*/
3、建立觸發器
      create or replace trigger dectuser_tb_tri
          before insert on dectuser     /*觸發條件:當向表dectuser執行插入操作時觸發此觸發器*/
           for each row                 /*對每一行都檢測是否觸發*/
           begin                        /*觸發器開始*/
                 select dectuser_tb_seq.nextval into :new.userid from dual;   /*觸發器主題內容,即觸發後執行的動作,在此是取得序列dectuser_tb_seq的下一個值插入到表dectuser中的userid欄位中*/
            end;
           /*退出sqlplus行編輯*/
4、提交
       commit;

       現在就完成了自增主鍵的設定,搞定!可以檢測一下。
      insert into dectuser(name,sex) values ('wang','女');
****************************************************************************************************

總的來說,通過在insert操作之前,新增一個觸發器,將序列的值放到了將要插入的資料的ID中。
所以,需要 建表->建序列->建觸發器 這樣一個過程。
我覺得有幾個要注意的
一是主鍵型別為 INT型比較好。
二是觸發器主題內容中,select...into 後面的冒號不能掉了。