`

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了。

分享到:
评论

相关推荐

    ORCALE语句大全

    - 插入记录: `insert into student2(SNo,Name,Sex,Birthday,Salary) values(sys_guid(),'朱文锋','男','01-5月-12',2000)` 以上是对提供的文档内容中关键知识点的梳理和详细解释。这些知识点覆盖了Oracle数据库的...

    6.2、oracle 相关sql1

    在这个主题中,我们将探讨几个与Oracle相关的SQL语句,这些语句在日常数据库操作中非常常见。 首先,`SELECT USER FROM DUAL;` 这个查询用于显示当前连接的Oracle数据库用户的名称。`DUAL`是Oracle中的一个特殊表,...

    ORACLE自增主键设置方法

    除了使用序列实现自增主键外,Oracle还提供了其他几种主键生成策略,比如使用`SYS_GUID()`函数生成全局唯一标识符(GUID)作为主键。这种方法适用于需要全局唯一性的场景,但可能不适合对性能要求较高的应用,因为`...

    大型数据库在java中的连接

    可以通过以下命令创建一个名为`sequence_student`的序列: ```sql CREATE SEQUENCE sequence_student INCREMENT BY 1 START WITH 1 NOMAXVALUE NOCYCLE CACHE 10; ``` 在这个例子中,`INCREMENT BY 1`表示每次调用...

    [应用开发及迁移]KingbaseES_V8R3至V8R6迁移最佳实践.pdf

    - **3.3.3 Function sys_guid()**:改进了sys_guid()函数的性能,使其能更快地生成全局唯一标识符(GUID)。 - **3.3.4 Function charindex()**:charindex()函数用于查找字符串中子串的位置,V8R6对其进行了优化,...

    JPA主键策略(针对数据库自增字段重置后无效检查项)

    这种策略对应MYSQL的uuid()函数,SQL Server的newid()函数,ORACLE的rawtohex(sys_guid())函数等。 uuid.hex uuid.hex是一种基于uuid的主键生成策略。这种策略和uuid策略类似,但建议使用uuid替换。 在JPA中,...

    IRPTrace2.00.002.zip

    IRPDRV.SYS - Driver for Windows NT/2000/XP/Server 2003 TERMINAL - Terminal log file TERMINAL.DLL - IRPTrace library UNINSDRV.DLL - IRPTrace library TSCUST.DLL - IRPTrace library IRPTRACE.CHM - ...

    SQLPLSQL.pdf

    - **高级函数**:介绍更复杂的函数,如REGEXP_INSTR、SYS_GUID等。 - **数字(Number)格式**:说明数字格式的定义方式及其在实际应用中的重要性。 - **日期(Date)格式**:解释日期格式的重要性,以及如何在SQL中定义...

Global site tag (gtag.js) - Google Analytics