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的初始化参数: &