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;
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了。
SYS GUID 與sequence的比較
sys guid 與sequence的比較 序列生成器sequence所生成的數字只能保證在單個例項裡是唯一的,這就不適合將它用作並行或者遠端環境裡的主關鍵字,因為各自環境裡的序列可能會生成相同的數字,從而導致衝突的發生。sys guid會保證它建立的識別符號在每個資料庫裡都是唯一的。此外,序列必須...
sql server建立序列sequence
1 建立乙個序列物件 1 create sequence schema name sequence name 2as built in integer type user defined integer type 3 start with 4increment by 5 6 7cycle 8 seq...
使用sys guid產生隨機數
今天同事需要建立乙個由36位的隨機數字,中間用一些 分割。沒有什麼好的方法,於是就問我。我也想了想,如何是最簡潔最快速呢?好像oracle沒有乙個這樣可以產生指定位數的純數字的函式。想到了sys guid 函式,專門用來產生32位的隨機數,不過中間包括一些大寫的英文本母。於是就想使用這個函式加上tr...