zoukankan      html  css  js  c++  java
  • 关于ORACLE的GUID主键生成

    ============转自=============
     
     
    项目中若采用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, 8, 4);
       v_guid_part_three := SUBSTR (v_guid, 12, 4);
       v_guid_part_four := SUBSTR (v_guid, 16, 4);
       v_guid_part_five := SUBSTR (v_guid, 20, 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;
    /
  • 相关阅读:
    react.js+axios跨域
    O2O项目之一 环境搭配
    跟scss相关的两个包
    [nodemon] app crashed
    解决node.js链接数据库时出现的报错 --- client does not support authentication
    在Xshell 运行angular 项目时,找不到node-sass模块,安装node-sass模块时,又出现权限问题
    ajax请求数据时,get和post的区别
    web前端如何性能优化提高加载速度
    js数组去重
    前端跨域
  • 原文地址:https://www.cnblogs.com/zjw520/p/3036979.html
Copyright © 2011-2022 走看看