SYS_GUID()与sequence的比较

系统 1499 0

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


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论