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