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

  

最新文章

  1. <hr>标签不止创建html水平线也可以画圆噢
  2. zabbix_sender自定义监控
  3. JS新手易错点
  4. 连接不上mysqlworkbench问题解决方法
  5. docker jenkins
  6. oracle用户
  7. JQuery上传插件uploadify整理(Events)
  8. Editplus 注册码
  9. win7进入不了系统故障修复
  10. BZOJ2553: [BeiJing2011]禁忌
  11. hadoop备记
  12. nyoj 37
  13. 获取MP3和M4A音乐文件的歌曲信息以及专辑图片--备用
  14. WPF 杂记
  15. MySQL--MHA原理
  16. Android为TV端助力 转载:Java 泛型
  17. java_BufferedReader的一个应用
  18. 【JAVA WEB教程】jsp环境搭建(eclipse)【详细+图文】
  19. 005_nginx414_nginx 414 Request-URI Too Large
  20. log4j2笔记 #02# 启用异步日志

热门文章

  1. JZOJ 5775. 【NOIP2008模拟】农夫约的假期
  2. linux 服务器被植入ddgs、qW3xT.2挖矿病毒处理记录
  3. Compiler Error Message: CS0016: Could not write to output
  4. Neon Lights in Hong Kong【香港霓虹灯】
  5. KMP的正确使用法_x新疆网络赛Query on a string
  6. VBA连接MySQL数据库以及ODBC的配置(ODBC版本和MySQL版本如果不匹配会出现驱动和应用程序的错误)
  7. WordCount by Java
  8. MySQL != 失效
  9. 数据结构设计 Stack Queue
  10. 【Part1】用JS写一个Blog(node + vue + mongoDB)