利用序列産生主鍵值。
序列(Sequence)是一種可以被多個使用者使用的用于産生一系列唯一數字的資料庫對象。序列定義存儲在資料字典中,通過提供唯一數值的順序表來簡化程式設計工作,可以使用序列自動産生主鍵的鍵值。當一個序列第一次被查詢調用時,它将傳回一個預定值。在随後的每次查詢中,序列将産生一個按指定的增量增長的值。序列可以循環,或者是連續增加的,直到指定的最大值為止。
建立序列文法如下:create sequence [模式]序列名稱[start with 起始數字] [increment by 增量][maxvalue 最大值|nomaxvalue][minvalue 最小值|nominva lue][cycle|nocuyle][cache 數目|nocache][order|noorder]。
通過序列起始數字、最大值、最小值和增量值可以确定序列是增序還是減序,每次增或減的多少。Nocyle選項用于确定在序列達到最大值(增序列)或最小值(減序列)之後不能再産生更多的值,用以防止序列回轉。
在Oracle資料庫中建立序列,在使用sql語句向資料庫中寫入資料的時候,利用序列産生的唯一值,實作表中主鍵值自增。例如:
- SQL>create table tablename
- (id number notnull,…);
- SQL >create sequence autoID increment by 1 start with 1 maxvalue 999999 cycle;
- SQL >insert into tablename values(autoID.nextval,...);
多個使用者可以共用一個序列,但它是針對所有的表,是以産生的序号對一個表而言産生的主鍵值唯一但是不連續。
使用觸發器産生主鍵值。
在資料表中,有時候需要主鍵值自動增加,但在Oracle資料庫中,沒有象Mysql的Autoincrement一樣自動增長的資料類型。在實作Oracle資料庫字段自增功能時,利用DML觸發器來完成。
觸發器(trigger)是一些過程,當發生一個特定的資料庫事件時就執行這些過程,可以使用觸發器擴充引用的完整性。DML即資料操縱語言,用于讓使用者或程式員使用,實作對資料庫中資料的操作。基本的資料操作分成兩類四種:檢索(查詢)和更新(插入、删除、修改)。觸發器類似于函數和過程,其在資料庫中以獨立身分存在。觸發事件可以是對資料庫表的DML(insert、update或delete)操作等。DML觸發器是目前最廣泛使用的一種觸發器,即由DML語句激發的觸發器,并有該語句決定DML觸發器的類型。其觸發事件包括insert(插入)、update(更新)和delete(删除)。無論哪種觸發事件,都能為每種觸發事件建立before觸發器和after觸發器。如可以在表上建立一個before insert 語句,表示在insert事件發生之前采取行動。
建立觸發器的文法如下:
- create[or replace]trigger 觸發器名稱
- {before|after|instead of}激發觸發事件
- referencing_clause
- [WHEN trigger_condition]
- [FOR EACH ROW]
referencing_clause用來引用正在處于修改狀态下的行中的資料,如果在WHEN子句中指定trigger_condition的話,則首先對該條件求值。觸發器主體隻有在該條件為真值時才運作。利用觸發器與序列相結合,可以實作在進行DML操作的時候,使表中主鍵值自動增加。其實作步驟可參照如下例子。
- drop table book;
- --建立表
- create table book(
- bookId varchar2(4) primary key,
- name varchar2(20)
- );
- --建立序列
- create sequence book_seq start with 1 increment by 1;
- --建立觸發器
- create or replace trigger book_trigger
- before insert on book
- for each row
- begin
- select book_seq.nextval into :new.bookId from dual;
- end ;
- --添加資料
- insert into book(name) values ('cc');
- insert into book(name) values ('dd');
- commit;
查詢資料:select * from book;
當需要對book資料庫表中的主鍵值進行寫值時,便可以使用sql語句利用序列+觸發器實作主鍵值自動增加.