時間:2015-06-28 00:00:00 來源:IT貓撲網(wǎng) 作者:網(wǎng)管聯(lián)盟 我要評論(9)
有兩種方法可以設(shè)置主鍵,一種是自增長主鍵,另一種就是生成唯一序列。
一、自增長主鍵
--首先建一個表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? --不設(shè)置最大值
start with 1????? --從1開始計數(shù)
increment by 1??? --每次加1個
nocycle???? --一直累加,不循環(huán)
nocache;??? --不建緩沖區(qū)??? 以上代碼完成了一個序列(sequence)的建立過程,名稱為SEQ_TEST,范圍是從1開始到無限大(無限大的程度是由你機(jī)器決定的),nocycle 是決定不循環(huán),如果你設(shè)置了最大值那么你可以用cycle 會使seq到最大之后循環(huán).對于nocache順便說一下如果你給出了cache值那么系統(tǒng)將自動讀取你的cache值大小個seq,這樣在反復(fù)操作時會加快運(yùn)行速度,但如果遭遇意外情況如當(dāng)機(jī)了或oracle死了,則下次取出的seq值將和上次的不連貫.(如果連不連貫無所謂,建議用cache,因?yàn)闀r間就是金錢呀!)
你只有了表和序列還不夠,最好再建一個觸發(fā)器來執(zhí)行它!代碼如下:
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位的唯一編碼。
序列生成器所生成的數(shù)字只能保證在單個實(shí)例里是唯一的,這就不適合將它用作并行或者遠(yuǎn)程環(huán)境里的主關(guān)鍵字,因?yàn)楦髯原h(huán)境里的序列可能會生成相同的數(shù)字,從而導(dǎo)致沖突的發(fā)生。SYS_GUID會保證它創(chuàng)建的標(biāo)識符在每個數(shù)據(jù)庫里都是唯一的。
此外,序列必須是DML陳述式的一部分,因此它需要一個到數(shù)據(jù)庫的往返過程(否則它就不能保證其值是唯一的)。SYS_GUID源自不需要對數(shù)據(jù)庫進(jìn)行訪問的時間戳和機(jī)器標(biāo)識符,這就節(jié)省了查詢的消耗。
很多應(yīng)用程序都依靠序列生成器來創(chuàng)建數(shù)據(jù)行的主關(guān)鍵字,這些數(shù)據(jù)行沒有一個明顯的主值,這也就是說,在這樣的數(shù)據(jù)集里一條記錄的創(chuàng)建就會讓數(shù)據(jù)列發(fā)生改變。因此,管理員可能會對在表格中將SYS_GUID用作主關(guān)鍵字而不使用序列數(shù)感興趣。這在對象在不同機(jī)器的不同數(shù)據(jù)庫里生成以及需要在后來合并到一起的情況下很有用。
使用SYS_GUID或者序列會在數(shù)據(jù)庫使用周期里的某些地方造成性能上的消耗;問題就是在哪里。對于SYS_GUID而言,性能上的影響在查詢時間和創(chuàng)建時間上(在表格里要創(chuàng)建更多的塊和索引以容納數(shù)據(jù))。對序列而言,性能上的影響在查詢期間,在這個時候,SGA序列的緩沖區(qū)被用光。在缺省情況下,一個序列一次會緩沖20個值。如果數(shù)據(jù)庫沒有使用這些值就關(guān)閉了,它們就會被丟失。
SYS_GUID生成的值的另一個顯著的不足之處是,管理這些值會變得困難得多。你必須(手動)輸入它們或者通過腳本來填充它們,或者將它們作為Web參數(shù)來傳遞。出于這些原因,將SYS_GUID作為一個主關(guān)鍵字不是一個很好主意,除非是在一個并行的環(huán)境里或者希望避免使用管理序列生成器的情況下。
關(guān)鍵詞標(biāo)簽:oracle主鍵
相關(guān)閱讀
熱門文章 Oracle中使用alter table來增加,刪除,修改列的語法 oracle中使用SQL語句修改字段類型-oracle修改SQL語句案例 誤刪Oracle數(shù)據(jù)庫實(shí)例的控制文件 為UNIX服務(wù)器設(shè)置Oracle全文檢索
人氣排行 oracle中使用SQL語句修改字段類型-oracle修改SQL語句案例 Oracle中使用alter table來增加,刪除,修改列的語法 ORACLE SQL 判斷字符串是否為數(shù)字的語句 ORACLE和SQL語法區(qū)別歸納(1) oracle grant 授權(quán)語句 ORACLE修改IP地址后如何能夠使用 如何加速Oracle大批量數(shù)據(jù)處理 Oracle刪除表的幾種方法