zoukankan      html  css  js  c++  java
  • Oracle创建自增长主键

    Oracle主键常用的分为UUID和自增长int两种,下面简单说下各自的优缺点:

    UUID的优点

    1、生成方便,不管是通过sys_guid() 还是java的uuid都能很方便的创建UUID。

    2、适合批量数据中的插入和更新操作。

    3、跨服务器数据合并非常方便。

    INT自增长的优点

    1、占用空间小

    2、性能好,UUID跟int比起来不在一个级别上

    3、容易记忆

    他们各自的优点就是彼此的缺点

    适用范围:

    一般在分布式环境中使用UUID作为唯一主键,至于其他项目本人强烈建议使用int作为主键。

    PS:最近我的一个分布式项目在周末访问高峰期也是会出现UUID重复的情况,所以UUID号称的全球唯一ID这个优点我没写上去,而我们可以使用Zookeeper作为主键生成器创建int类型的唯一主键,这是完全没有问题的。

    所以综上我还是建议所有的主键都应该使用int类型,在千万级别的数据量上int类型的优点尤为明显。

    Oracle创建自增长的步骤:

    创建自增长序列

    -- 创建自增长序列
    create sequence seq_on_chance_contract
    increment by 1 -- 每次加1
    start with 1 -- 从1开始计数
    nomaxvalue -- 不设置最大值
    nocycle -- 一直累加
    nocache; 
     
    创建数据表
    主键可以使用INTEGER和NUMBER,若系统使用Hibernate作为ORM框架则不推荐使用NUMBER
    create table TBL_CHANCE_CONTRACT
    (
      ID                INTEGER  PRIMARY KEY,
      CHANCE_SUCCESS_ID VARCHAR2(50) not null,
      CONTENT           CLOB,
      CREATE_USER_ID    VARCHAR2(50),
      CREATA_USER_NAME  VARCHAR2(80),
      CREATE_DATE       TIMESTAMP(6)
    )
    

    创建主键触发器,以便新增记录的时候不需要管理ID主键

    -- 创建主键触发器  
    CREATE OR REPLACE TRIGGER tg_on_id_chance_contract 
           BEFORE INSERT ON TBL_CHANCE_CONTRACT FOR EACH ROW WHEN (new.ID is null)
    BEGIN
           SELECT seq_on_chance_contract.nextval into:new.ID from dual;
    END; 
    

      

    一些小技巧:

    查看所有的序列、表

    -- 查找所有SEQUENCE、TABLE
    select * from user_objects ubs;
    -- 查找所有SEQUENCE
    select * from user_objects ubs where ubs.OBJECT_TYPE='SEQUENCE';
    

      

    查看当前序列到了多少

    select seq_on_chance_contract.nextval from dual;
    select seq_on_chance_contract.currval from dual;
    

      

    重置序列
    一般重置序列是需要删除序列然后重建,但是这样比较麻烦,在不删除序列的情况下有以下2中方式:

    1、利用步长参数,先查出sequence的nextval,记住,把递增改为负的这个值(反过来走),然后再改回来。 

    假设需要修改的序列名seq_on_chance_contract

    -- 重置序列
    select seq_on_chance_contract.nextval from dual;        -- 假设得到结果 n
    alter sequence seq_on_chance_contract increment by -2;  -- 注意是 -(n-1) 
    select seq_on_chance_contract.nextval from dual;        -- 再查一遍,走一下,重置为1了 
    alter sequence seq_on_chance_contract increment by 1;   -- 还原 
    

      

    2、利用存储过程实现 (v_seqname)

    create or replace procedure seq_reset(v_seqname varchar2) as n number(10); 
    tsql varchar2(100); 
    begin 
    execute immediate 'select '||v_seqname||'.nextval from dual' into n; 
    n:=-(n-1); 
    tsql:='alter sequence '||v_seqname||' increment by '|| n; 
    execute immediate tsql; 
    execute immediate 'select '||v_seqname||'.nextval from dual' into n; 
    tsql:='alter sequence '||v_seqname||' increment by 1'; 
    execute immediate tsql; 
    end seq_reset; 
    

    然后调用存储过程:  

    exec seq_reset('v_seqname'); 
    

      

  • 相关阅读:
    Orchard:打包和共享模块
    Orchard:处理1对多的关系
    SOA:服务集成成熟度模型(Service Integration Maturity Model)
    读书笔记:遇见未知的自己
    101与金根回顾敏捷个人:(83)如何组织一个学习小组
    色拉英语第2集第5幕:Do you speak English
    Orchard: Shape展现介绍
    Black Cat有声名著【1】1 Peter Pan 彼得.潘 【故事介绍】
    产品管理:孵化产品Beta流程
    色拉英语第4集第1幕: where Am I
  • 原文地址:https://www.cnblogs.com/jianzh5/p/6112801.html
Copyright © 2011-2022 走看看