Advertisement

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;

上面的代码就可以实现自动递增的功能了。

或者

  1. create or replace trigger "SEQ_ON_USER_GENERATOR" before
  2. insert on databasename1.T_USER for each row
  3. declare
  4. mid number,
  5. begin
  6. select SEQ_ON_USER.nextval into mid from dual;
  7. :new.id:=mid;
  8. end
  9. create trigger SEQ_ON_USER_Trigger
  10. before insert on T_USER for each row
  11. begin
  12. select SEQ_ON_USER.nextval into :new.id from dual;
  13. end SEQ_ON_USER_Trigger;

全部评论 (0)

还没有任何评论哟~