最近總結了一下oracle主鍵的設定方法,貼到這儲存一下吧。有兩種方法可以設定主鍵,一種是自增長主鍵,另一種就是產生唯一序列。
一、自增長主鍵
--首先建一個表TEST
create table TEST ( NID int PRIMARY KEY, test1 varchar2(20), test2 varchar2(20), test3 varchar2(20), test4 varchar2(20), test5 varchar2(20) )
-- 再建一個序列SEQ_TEST
create sequence SEQ_TEST minvalue 1 --最小值 nomaxvalue --不設定最大值 start with 1 --從1開始計數 increment by 1 --每次加1個 nocycle --一直累加,不迴圈 nocache; --不建緩衝區
以上程式碼完成了一個序列(sequence)的建立過程,名稱為SEQ_TEST,範圍是從1開始到無限大(無限大的程度是由你機器決定的),nocycle 是決定不迴圈,如果你設定了最大值那麼你可以用cycle 會使seq到最大之後迴圈.對於nocache順便說一下如果你給出了cache值那麼系統將自動讀取你的cache值大小個seq,這樣在反覆操作時會加快運行速度,但如果遭遇意外情況如當機了或oracle死了,則下次取出的seq值將和上次的不連貫.(如果連不連貫無所謂,建議用cache,因為時間就是金錢呀!)
你只有了表和序列還不夠,最好再建一個觸發器來執行它!代碼如下:CREATE OR REPLACE TRIGGER tg_test BEFORE INSERT ON test FOR EACH ROW WHEN (new.nid is null) begin select seq_test.nextval into:new.nid from dual; end;
下面是測試select * from test insert into test(nid,test1) values(6,'aaa') insert into test(test1) values('bbb')
二、唯一序列 SYS_GUID() 產生32位的唯一編碼。
序列產生器所產生的數字只能保證在單個執行個體裡是唯一的,這就不適合將它用作並行或者遠程環境裡的主關鍵字,因為各自環境裡的序列可能會產生相同的數字,從而導致衝突的發生。SYS_GUID會保證它建立的標識符在每個資料庫裡都是唯一的。
此外,序列必須是DML陳述式的一部分,因此它需要一個到資料庫的往返過程(否則它就不能保證其值是唯一的)。SYS_GUID源自不需要對資料庫進行訪問的時間戳記和機器標識符,這就節省了查詢的消耗。
很多應用程式都依靠序列產生器來建立資料行的主關鍵字,這些資料行沒有一個明顯的主值,這也就是說,在這樣的資料集裡一條記錄的建立就會讓資料列發生改變。因此,管理員可能會對在表格中將SYS_GUID用作主關鍵字而不使用序列數感興趣。這在對象在不同機器的不同資料庫裡產生以及需要在後來合并到一起的情況下很有用。
使用SYS_GUID或者序列會在資料庫使用周期裡的某些地方造成效能上的消耗;問題就是在哪裡。對於SYS_GUID而言,效能上的影響在查詢時間和建立時間上(在表格裡要建立更多的塊和索引以容納資料)。對序列而言,效能上的影響在查詢期間,在這個時候,SGA序列的緩衝區被用光。在預設情況下,一個序列一次會緩衝20個值。如果資料庫沒有使用這些值就關閉了,它們就會被丟失。
SYS_GUID產生的值的另一個顯著的不足之處是,管理這些值會變得困難得多。你必須(手動)輸入它們或者通過指令碼來填充它們,或者將它們作為Web參數來傳遞。出於這些原因,將SYS_GUID作為一個主關鍵字不是一個很好主意,除非是在一個並行的環境裡或者希望避免使用管理序列產生器的情況下。
博文來源:http://blog.csdn.net/tianping168/archive/2008/08/29/2847747.aspx