博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
oracle入坑日记<六>自增列创建和清除(含序列和触发器的基础用法)
阅读量:6277 次
发布时间:2019-06-22

本文共 3038 字,大约阅读时间需要 10 分钟。

0
 
前言

用过 SQLserverMySQL 的自增列(auto_increment),然而 Oracle 在建表设置列时却没有自增列。

查阅资料后发现 Oracle 的自增列需要手动编写。

1
 
序列

 1.1、创建序列(sequence)

create sequence [sequence_name]  --创建序列increment by 1  --递增步长为1start with 1    --开始值为1nomaxvalue      --没有最大值 (设置最大值:maxvalue 1000)minvalue 1      --最小值为1  (不设最小值:nominvalue)nocycle         --不循环    (设置循环:cycle)cache 20;       --缓存20    (不设缓存:nocache)

 序列的所有属性都是选择设置(非必须设置),若全部属性使用默认值可直接使用 create sequence [sequence_name]; 

1.2、各属性默认值

  increment (步长): 1;

  start (开始值) : 1;

  maxvalue (最大值) : 10的28次方;

  minvalue (最小值) : 1 ;

  cycle (循环) : no ;

  cache (缓存) : 20 ;

  

1.3、序列使用

  1.3.1、当前序列值: [sequence_name].currval --当前序列值 

     在dual表中查看当前序列值: select [sequence_name].currval from dual; 

  1.3.2、下一个序列值(实现自增):  [sequence_name].nextval --下一个序列值 

     初创建的序列必须先调用一次 nextval 才能使用 currval , 因为初次创建的序列没有当前值,所以必须产生一个值之后才有当前值。

1.4、序列中缓存的理解

  序列中的缓存是就是一次性储备一定数量的空间,类似数据库初创时设置的自增大小一样;当序列被使用至当前最大储备值时,系统将再次准备缓存数量的空间。用系统表  user_sequence  记录序列对象的变化来帮助理解缓存(重点看 last_number 的变化)。

  初创序列时的数据情况

  

  当调用一次 nextval 后

  

  当序列值使用到当前 laser_number 时, laser_number 值 = 当前last_number + cache_size

  

创建序列后就已经可以实现自增列的效果,例: 

insert into ryxxb values (AUTOSEQ.nextval,'张三',AUTOSEQ.nextval + 100,'男')  --给人员信息表插入一条数据 id和编号 就使用序列

2
 
触发器

 2.1、创建触发器基本语法

CREATE OR REPLACE TRIGGER [trigger_name]{
[before] | [after] | [instead of]} --{[之前] | [之后 | [替换]} 触发时机{
[insert] | [delete] | [update[of column]]} --{[插入] | [删除] | [更新]{更新时可指定列名,仅在更新指定列时才会触发}} 触发操作ON {
[table_name] | [view_name]} --{[表明] | [视图名]} 触发器目标[FOR EACH ROW] --可选 触发器类型 [FOR EACH ROW (行级触发器)] 或 语句触发器[WHEN (condition)] --可选 触发条件 可选择加入触发条件BEGIN [pl\sql] --触发器执行内容END

 2.2、为自动序列创建触发器

create trigger autotri  --创建触发器before insert on ryxxb   --[ryxxb]在执行[insert]操作之前触发  for each row           --行级触发器    -- 触发器内容    begin      select autoseq.nextval into :new.ryid from dual;  --取下一个序列值赋值给[ryid]字段      select (autoseq.currval + 100) into :new.rybh from dual;  --取当前序列值赋值+100给[rybh]字段      end;
3
 
清空自动序列

3.1、手动清空序列

  1)查看当前序列的值: select seq_auto.currval from dual; 

  

  2)根据当前序列值设置序列步长: alter sequence seq_auto increment by -120; 

  3)获取next序列值: select seq_auto.nextval from dual; 

  

  4)还原序列步长: alter sequence seq_auto increment by 1; 

3.2、用储存过程实现自动清空序列

create or replace procedure pro_clear_seq(v_seqname varchar2)         -- 创建储存过程 par:要清空的序列名    as n number(10);    tsql varchar2(100); begin execute immediate 'select '||v_seqname||'.nextval from dual' into n;    -- 获取序列当前值  n:=-(n-1);  tsql:='alter sequence '||v_seqname||' increment by '|| n;                -- 更新步长为当前序列负值  execute immediate tsql; execute immediate 'select '||v_seqname||'.nextval from dual' into n;    -- 获取next序列值  tsql:='alter sequence '||v_seqname||' increment by 1';                -- 还原步长为1 execute immediate tsql; end seq_reset;

执行储存过程:

begin   pro_clear_seq('seq_auto'); end;

<<============================================================================================================================================>>

此日记系列仅做普通开发使用Oracle,并非专业DBA
 

 

 

 

 

 

转载于:https://www.cnblogs.com/MirageFox/p/10358511.html

你可能感兴趣的文章
Linux中的网络监控命令
查看>>
360项目-07
查看>>
使用Nginx进行TCP/UDP端口转发
查看>>
读书笔记2(Effective java)
查看>>
[bat]批量替换文件内容
查看>>
Java代码到字节码——第一部分
查看>>
Linux挂载安装VMware tool
查看>>
Android中利用ViewFliper实现屏幕切换效果
查看>>
群发quota报警邮件脚本
查看>>
C语言进阶【文件】常用文件操作函数详解(一)
查看>>
(四)基于Spring Cloud Fegin的跨服调用
查看>>
博为峰Java技术文章 ——JavaEE Hibernate实例状态
查看>>
RFC4291, IPv6 的单播地址到底是哪几种?
查看>>
Linux(centos)系统各个目录的作用详解 推荐
查看>>
zabbix监控进程与端口
查看>>
Libvirsh 问题:GLib-WARNING **: gmem.c:483: custom memory allocation vtable not supported
查看>>
COALESCE函数
查看>>
Ext.require callback 不执行
查看>>
面试题:连续子数组的最大和
查看>>
书生教你cocos2d-x-入门篇(一)
查看>>