序列生成器sequence所生成的數字只能保證在單個實例里是唯一的,這就不適合將它用作并行或者遠程環境里的主關鍵字,因為各自環境里的序列可能會生成相同的數字,從而導致沖突的發生。
SYS_GUID會保證它創建的標識符在每個數據庫里都是唯一的。
此外,序列必須是DML陳述式的一部分,因此它需要一個到數據庫的往返過程(否則它就不能保證其值是唯一的)。
SYS_GUID源自不需要對數據庫進行訪問的時間戳和機器標識符,這就節省了查詢的消耗。
create table use_seq_table(id integer);
create sequence use_seq_sequence;
insert into use_seq_table values (use_seq_sequence_value.nextval);
create table use_guid_table(id raw(16));
insert into use_guid_table(sys_guid());
對象在不同機器的不同數據庫里生成以及需要將數據合并到一起的情況下,SYS_GUID很有用。
SYS_GUID()與sequence的作用及用法基本相同,都可以放在bi觸發器中使用。
-- Create sequence
create sequence SEQ_ADDRESS
minvalue 1
maxvalue 999999999999999999999999999
start with 1
increment by 1
nocache;
create or replace trigger tri_address_bi before insert on address for each row
begin
?if :new.id<0 or :new.id is null then
??select seq_address.nextval into :new.id from dual;
????? --select substr(sys_guid(),1,32) into :new.id from dual;
?end if;
end;
/
使用限制:
SYS_GUID生成的值的另一個顯著的不足之處是,管理這些值會變得困難得多。你必須(手動)輸入它們或者通過腳本來填充它們,或者將它們作為Web參數來傳遞。
出于這些原因,將SYS_GUID作為一個主關鍵字不是一個很好主意,除非是在一個并行的環境里或者希望避免使用管理序列生成器的情況下。
不過,使用SYS_GUID來做主鍵也不是不可以,但需要先轉為 varchar2 較好。最好在使用時顯示轉換一下,如:substr(sys_guid(),1,32),直接使用RAW顯然是不合適的。
直接插 raw 進入 varchar2 字段,發生隱式的轉換,總不是太妥。曾見過因為大量隱式轉換導致最后數據庫崩潰,當然事后看是數據庫的bug了。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
