序列(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語句利用序列+觸發器實現主鍵值自動增加.
原文出自http://blog.csdn.net/java3344520/article/details/4907591