一、背景
项目开发过程中,数据库表中的主键值有时需要被设置为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个号
//使用缓存产生号,优点是提高效率,缺点是可能产生跳号
序列出现不连续原因:
- 1、回滚
- 2、系统异常
- 3、多个表同时使用同一序列
三、使用序列设置自增
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功能了。但触发器如果建的过多,会比较混乱,不易管理。