最近總結了一下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作爲一個主關鍵字不是一個很好主意,除非是在一個並行的環境裏或者希望避免使用管理序列生成器的情況下。