读书人

oracle中自动增长列的设立

发布时间: 2012-08-26 16:48:06 作者: rapoo

oracle中自动增长列的设置
例如在表user中将主键uid设为自动增长列:

table: user

column: uid ,定义为主键,int或number

结合sequence和trigger实现id列的值的自动增长:

1、create a sequence for the column `uid` of `user`:

CREATE SEQUENCE seq_user_uid
INCREMENT BY 1  -- 每次加几个
START WITH 1   -- 从1开始计数
NOMAXVALUE    -- 不设置最大值
MINVALUE 1 -- 序列最小值,小于或等于start值
-- MAXVALUE  20  -- 累加,最大值20
NOCYCLE  -- 一直累加,不循环
--CYCLE  -- 循环 ,达到最大值20后重新开始,违反唯一约束,不适用于主键
CACHE 10 -- 缓存序列个数,有助于提高效率,但可能造成跳号。

2、Create a trigger for table `user`:

create or replace trigger user_trg
before insert on user
for each row --行级的trigger
declare
tmpNum number;
begin
SELECT seq_user_uid.nextval INTO tmpNum FROM dual;
--:new.uid := 'u' || lpda(tmpNum,7,'0');
:new.uid := tmpNum;
end user_trg;

-------------------------//--:new uid := 'u' || lpda(tmpNum,7,'0');可能有问题,触发器可能会报错,

或者直接写成

create or replace trigger user_trg
before insert on user
for each row --行级的trigger
begin
SELECT seq_user_uid.nextval INTO :new.uid FROM dual;
end user_trg;

3、插入值时必须将列名都写上。

一旦定义了seq_user_uid,你就可以用CURRVAL,NEXTVAL
CURRVAL=返回 sequence的当前值
NEXTVAL=增加sequence的值,然后返回 sequence 值
比如:
seq_user_uid.CURRVAL
seq_user_uid.NEXTVAL

可以使用sequence的地方:
- 不包含子查询、snapshot、VIEW的 SELECT 语句
- INSERT语句的子查询中
- NSERT语句的VALUES中
- UPDATE 的 SET中

INSERT INTO emp VALUES
(empseq.nextval, 'LEWIS', 'CLERK',7902, SYSDATE, 1200, NULL, 20); //empseq.nextval, 添加自增列
SELECT empseq.currval FROM DUAL; //返回最后一个自增值


Alter Sequence
你或者是该sequence的owner,或者有ALTER ANY SEQUENCE 权限才能改动sequence. 可以alter除start至以外的所有sequence参数.如果想要改变start值,必须 drop sequence
再 re-create .
Alter sequence 的例子
ALTER SEQUENCE emp_sequence
  INCREMENT BY 10
  MAXVALUE 10000
  CYCLE   -- 到10000后从头开始
  NOCACHE ;


影响Sequence的初始化参数:
SEQUENCE_CACHE_ENTRIES =设置能同时被cache的sequence数目。

可以很简单的Drop Sequence
DROP SEQUENCE order_seq;

读书人网 >其他数据库

热点推荐