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;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值