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
1 2 3 4 5 6 7 8 9 | 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主键
1 2 3 4 5 6 | -- 创建主键触发器 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 ; |
一些小技巧:
查看所有的序列、表
1 2 3 4 | -- 查找所有SEQUENCE、TABLE select * from user_objects ubs; -- 查找所有SEQUENCE select * from user_objects ubs where ubs.OBJECT_TYPE= 'SEQUENCE' ; |
查看当前序列到了多少
1 2 | select seq_on_chance_contract.nextval from dual; select seq_on_chance_contract.currval from dual; |
重置序列
一般重置序列是需要删除序列然后重建,但是这样比较麻烦,在不删除序列的情况下有以下2中方式:
1、利用步长参数,先查出sequence的nextval,记住,把递增改为负的这个值(反过来走),然后再改回来。
假设需要修改的序列名seq_on_chance_contract
1 2 3 4 5 | -- 重置序列 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)
1 2 3 4 5 6 7 8 9 10 11 | 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; |
然后调用存储过程:
1 | exec seq_reset( 'v_seqname' ); |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具