oracle创建自增序列
在 Oracle 数据库环境中创建自增字段时,则必须使用 sequence 对象来生成唯一的序列值以确保数据的一致性和完整性。同样,在 MySQL 数据库环境中也能够实现类似的功能但由于具体实现细节有所不同建议以后再详细说明为了便于日后查阅和参考我们将重点介绍 Oracle 环境下 sequence 的基本使用方法和操作流程。
Oracle 中的序列用于生成递增的编号。每当从该序列获取值时,系统会自动自增一次。 该序列与表之间并无任何关联。
1. Create Sequence
首先要有CREATE SEQUENCE或者CREATE ANY SEQUENCE权限。
创建语句如下:
CREATE SEQUENCE seqTest
INCREMENT BY 1 -- 每次加几个
START WITH 1 -- 从1开始计数
NOMAXvalue -- 不设置最大值
NOCYCLE -- 一直累加,不循环
CACHE 10; --配置缓存cache个序列,在系统出现故障或其他异常情况下可能导致序列中断,请根据需求选择是否启用$nocache模式
说明:
minvalue:序列最小值
maxvalue/nomaxvalue:序列最大值/没有最大值
start with 1:序列从1开始
increment by 1:每次增加1
cache/nocache:不启用缓存会导致数据持久化问题;启用缓存可以提高性能;但需要谨慎考虑系统稳定性
2.查看已有sequence:
select * from user_sequences;
Select * from all_sequences;
3.得到Sequence值
两种方式
① select last_number from user_sequences where sequence_name='SEQ_ON_USER';
② select SEQ_ON_USER.nextval from sys.dual;
定义好sequence后,你就可以用currVal,nextVal取得值。
CurrVal:返回 sequence的当前值
NextVal:增加sequence的值,然后返回 增加后sequence值
得到值语句如下:
SELECT Sequence名称.CurrVal FROM DUAL;
如得到上边创建Sequence值的语句为:
select seqtest.currval from dual
在Sql语句中可以使用sequence的地方:
- 不包含子查询、snapshot、VIEW的 SELECT 语句
- INSERT语句的子查询中
- INSERT语句的values中
- UPDATE 的 SET中
如在插入语句中
insert into 表名(id,name)values(seqtest.Nextval,'sequence 插入测试');
注:
- 首次调用
NEXTVAL函数将返回预设的初始值。每次调用NEXTVAL时,默认增量设置将被应用,并返回已包含该增量的新值。
CURRVAL始终返回该SEQUENCE的当前值,在NEXTVAL首次初始化后才能被使用,在此之前可能会导致错误。
使用一次NEXTVAL会导致SEQUENCE字段递增一个值。因此,在同一语句内连续使用多个NEXTVAL时,它们将获得不同的递增数值。
- 当设置CACHE值时, ORACLE可以在内存中预先放置一些sequence来提高存取速度.
- 当从缓存中取出一组数据后, Oracle会自动补充至缓存.
- 使用缓存可能会导致编号跳跃的情况发生;例如, 在数据库出现故障(如shutdown abort)时会发生这种情况.
- 因此,在创建序列时应避免使用nocache以防止此类问题的发生.
4.Alter Sequence
仅凭拥有ALTER ANY SEQUENCE 权限的人才能改动序列表中的序列号. 允许对除 start 至 以外的所有序列参数进行修改. 若要更改开始值, 则需先 drop 该序列再重新创建一次.
例:
alter sequence SEQTEST maxvalue 9999999;
另: SEQUENCE_CACHE_ENTRIES参数,设置能同时被cache的sequence数目。
5.Drop Sequence
DROP SEQUENCE seqTest;
6. 一个例子
create sequence SEQ_ID
minvalue 1
maxvalue 99999999
start with 1
increment by 1
nocache
order;
建解发器代码为:
create or replace trigger tri_test_id
before insert on S_Depart --S_Depart 是表名
for each row
declare
nextid number;
begin
IF :new.DepartId IS NULLor :new.DepartId=0 THEN --DepartId是列名
select SEQ_ID.nextval --SEQ_ID正是刚才创建的
into nextid
from sys.dual;
:new.DepartId:=nextid;
end if;
end tri_test_id;
上面的代码就可以实现自动递增的功能了。
或者
- create or replace trigger "SEQ_ON_USER_GENERATOR" before
- insert on databasename1.T_USER for each row
- declare
- mid number,
- begin
- select SEQ_ON_USER.nextval into mid from dual;
- :new.id:=mid;
- end
- create trigger SEQ_ON_USER_Trigger
- before insert on T_USER for each row
- begin
- select SEQ_ON_USER.nextval into :new.id from dual;
- end SEQ_ON_USER_Trigger;
