oracle 如何自增长,Oracle如何创建自增长主键

67be371dde038befdeb7294f32ce0c97.png

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框架则不推荐使用NUMBERcreate 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');

本文来自php中文网,mysql教程栏目,欢迎学习!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值