• 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'); 
    

      

  • 相关阅读:
    Java基础6
    多行文本框回车换行设置
    CentOS7系统配置国内yum源和epel源
    System Integrity Protection (SIP) iOS10.15安装软件提示文件损坏问题解决方法
    转载:Spring Boot 不使用默认的 parent,改用自己的项目的 paren
    微软Speech语音合成技术
    反编译工具
    线性链表的代码实现
    不一样的鸡汤,你有房吗?你有车吗?你有房车吗?
    递归,迭代和回调
  • 原文地址:https://www.cnblogs.com/jianzh5/p/6112801.html
Copyright © 2020-2023  润新知