ORACLE 生成GUID

原文鏈接:https://blog.csdn.net/hellolib/article/details/12946799

項目中若採用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;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章