SYS_GUID()與sequence的比較

序列生成器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;post

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;
/ui

使用限制:
SYS_GUID生成的值的另外一個顯著的不足之處是,管理這些值會變得困可貴多。你必須(手動)輸入它們或者經過腳原本填充它們,或者將它們做爲Web參數來傳遞。  
出於這些緣由,將SYS_GUID做爲一個主關鍵字不是一個很好主意,除非是在一個並行的環境裏或者但願避免使用管理序列生成器的狀況下。
不過,使用SYS_GUID來作主鍵也不是不能夠,但須要先轉爲 varchar2 較好。最好在使用時顯示轉換一下,如:substr(sys_guid(),1,32),直接使用RAW顯然是不合適的。
直接插 raw 進入 varchar2 字段,發生隱式的轉換,總不是太妥。曾見過由於大量隱式轉換致使最後數據庫崩潰,固然過後看是數據庫的bug了。spa

相關文章
相關標籤/搜索