ORACLE 生成GUID

ORACLE 专栏收录该内容
14 篇文章 2 订阅

项目中若采用oracle数据库,则主键生成可以有两种方式,一是用sys_guid(),二是定义一个sequence,然后用nextval得到ID。 
Oracle的定义sequence例子: 
create sequence seq_test 
minvalue 10000 
maxvalue 99999999999999999 
start with 20000 
increment by 1 
cache 20 
cycle 
order; 
从网络搜索得到的结论看,一般的意见总结为: 
1.SYS_GUID()比sequence复杂; 
2.SYS_GUID做主键,则表、索引存储开销多; 
3.SYS_GUID索引查询比sequence慢; 
但实际上,若每天5万条记录,则一年365*50000=18250000条记录,则理论上需要多耗费空间约合 1.46 GB 存储空间.显然,这些空间对当前的服务器的内存系统而言,影响并不大(按月分区), 就磁盘消耗而言都是微不足道的. 
查询的时候用guid和sequence执行计划也是差不多的,也就是查询效率并不一定差。 
从实践来看,使用SYS_GUID()做主键的优点多于负面影响。特别是在多个数据库数据集成时,GUID的优点显而易见。而关系数据库设计的法则约定:“主键不要代表任何意义”,更何况开发商既然提供这个功能而且一直在用,所以它的存在自有它的可取之处,因此建议采用guid。 

的确,在现有项目中由于中小学数据库不在同一个数据库服务器上,user表中主建ID使用的是sequence方式。这样导致了项目在运行之2个库表的ID重复,很难整合在一起,因此想到了M记Sql Server中的GUID类型,使用它做为主键后跨主机跨数据库的ID重复将可以被有效解决,在将来可能的系统集成或迁移中将完全不受ID重复问题的困扰。

下面是ORACLE中利用SYS_GUID ()函数实现兼容M记Sql Server中GUID类型规格的GUID串:

CREATE OR REPLACE FUNCTION GET_GUID
   RETURN CHAR
IS
   v_guid              CHAR (38);
   v_guid_part_one     CHAR (8);
   v_guid_part_two     CHAR (4);
   v_guid_part_three   CHAR (4);
   v_guid_part_four    CHAR (4);
   v_guid_part_five    CHAR (12);
BEGIN
   SELECT SYS_GUID ()
     INTO v_guid
     FROM DUAL;
   v_guid_part_one := SUBSTR (v_guid, 0, 8);
   v_guid_part_two := SUBSTR (v_guid, 9, 4);
   v_guid_part_three := SUBSTR (v_guid, 13, 4);
   v_guid_part_four := SUBSTR (v_guid, 17, 4);
   v_guid_part_five := SUBSTR (v_guid, 21, 12);
   v_guid :=
    CONCAT
     (CONCAT
        ('',  /*{*/
        CONCAT
           (CONCAT
               (CONCAT
                   (CONCAT (CONCAT (CONCAT (CONCAT (CONCAT (v_guid_part_one,
                                                            '-'),
                                                    v_guid_part_two
                                                   ),
                                            '-'
                                           ),
                                    v_guid_part_three
                                   ),
                            '-'
                           ),
                    v_guid_part_four
                   ),
                '-'
               ),
            v_guid_part_five
           )
    )
    ,
   ''/* }*/
 );
   RETURN (v_guid);
END GET_GUID;

  • 0
    点赞
  • 0
    评论
  • 2
    收藏
  • 扫一扫,分享海报

参与评论
请先登录 后发表评论~
©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值