Oracle ~ Sequence实现自增
背景
- MySQL建表时必须有一个主键(PRIMARY KEY), 每条主键内容必须唯一(Unique), 所以经常使用一个”ID”字段作为主键,给它一个”auto_increment”属性,让”ID”字段每条记录都自增”1″。insert 的时候,用不着理会自增主键的value,插入新项时会自动给id赋值,插入新纪录时用不着考虑自增主键
CREATE TABLE Demo
(
id INT NOT NULL auto_increment PRIMARY KEY,
key1 VARCHAR2(40) NULL,
key2 VARCHAR2(40) NULL
);
-
Oracle没有这个”auto_increment”属性,所以它没法像MySQL般在表内定义自增主键。
但是,Oracle里的序列(SEQUENCE),可间接实现自增主键的作用。 -
序列(Sequence),又叫序列生成器,用于提供一系列的数字,开发人员使用序列生成唯一键。每次访问序列,序列按照一定的规律增加或者减少。
序列的定义存储在SYSTEM表空间中,序列不像表,它不会占用磁盘空间。
序列独立于事务,每次事务的提交和回滚都不会影响序列。
CREATE SEQUENCE SEQNAME --序列名字
INCREMENT BY 1 --每次自增1, 也可写非0的任何整数,表示自增,或自减
START WITH 1 --以该值开始自增或自减
MAXVALUE 1.0E20 --最大值;设置NOMAXVALUE表示无最大值
MINVALUE 1 --最小值;设置NOMINVALUE表示无最大值
CYCLE or NOCYCLE --设置到最大值后是否循环;
CACHE 20 --指定可以缓存 20 个值在内存里;如果设置不缓存序列,则写NOCACHE
ORDER or NOORDER --设置是否按照请求的顺序产生序列
代码实现
--准备工作创建一张表
create table dept_p(
dept_id VARCHAR2(40) not null,
dept_name VARCHAR2(40),
parent_id VARCHAR2(40),
state NUMBER(11),
dept_sort NUMBER(11)
);
alter table DEPT_P add [constraint dept_id] primary key(dept_id);
方式一:序列化+触发器
第一步:创建序列sequence
create sequence seq_t_dept
minvalue 1
maxvalue 99999999
start with 1
increment by 1
cache 50
第二步:建立触发器
create or replace trigger "dept_trig"
before insert on dept_p
referencing old as old new as new for each row
declare
begin
select seq_t_dept.nextval into :new.dept_sort from dual;
end dept_trig;
第三步:插入数据测试看dept_sort是否自增
insert into dept_p values('001', '安保部', '000', 1);
select * from dept_p;
方式二:序列化+显示调用
在真实情况下,用方法一,可以做到免插入自增长
第一步:创建序列sequence
//创建sequence
create sequence seq_on_dept
increment by 1
start with 1
nomaxvalue
nocycle
nocache;
第二步:显示调用序列
insert into dept_p values('001', '安保部', '000', 1, seq_on_test.nextval);insert into dept_p values('001', '安保部', '000', 1, seq_on_test.nextval);
第三步:查询进行查看
select * from dept_p
注:
--查看序列当前值和下一个值的查看方式
select seq_on_dept.currval from dual;
select seq_on_dept.nextval from dual;