一、背景

项目开发过程中,数据库表中的主键值有时需要被设置为number类型且自增。MySql、Sql Server中使用工具创建表时能够很方便的设置自增,但是Oracle中没有设置自增的方法,一般情况使用序列和触发器来实现主键自增功能。

二、Oracle序列

--要有创建序列权限
create sequence / create any sequence
 --删除序列
drop sequence sequence_name;    

查找序列

--查找用户已创建的序列
select * from user_sequences;

--模糊搜索,序列
select * from user_sequences  where  sequence_name like '%MY%';

创建序列

drop sequence sequence_name;     --删除序列
create sequence sequence_name
    increment by 1   --定义序列步长,若为负数,则按此步长递减   改行可省略,省略默认值为1
    start with 1     --从1开始
    maxvalue   99999999   /  nomaxvalue   --没有最大值
    minvalue 1            --最小值从1开始
    cycle      --累加到最大值后又循环开始  
    /nocycle   --一直累加不循环
    cache  500  /   nocache    --不使用缓存
order;

//cache 10 表示一次产生10个号
//使用缓存产生号,优点是提高效率,缺点是可能产生跳号

<br>

序列出现不连续原因:
- 1、回滚
- 2、系统异常
- 3、多个表同时使用同一序列

<br>

三、使用序列设置自增

Oracle中建立一个序列:

如:create sequences sequences_name start with 1 increment by 1;
--建立了一个从 1 开始每次加 1 的序列

访问序列时,用 sequences_name.nextval的语法。
对于表数据插入时实现id字段自增,可以使用如下类似语法

insert into test values (sequences_name.nextval,'ABC');

当然也可以自动一些,对表的插入操作,建立一个触发器,每当有数据插入时,触发器自动修改id值为序列的新值,这样就完全实现自增id功能了。但触发器如果建的过多,会比较混乱,不易管理。

<br>


星河滚烫,你是人间理想