0
 
前言

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

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

1
 
序列

 1.1、创建序列(sequence)

create sequence [sequence_name]  --创建序列
increment by 1 --递增步长为1
start with 1 --开始值为1
nomaxvalue --没有最大值 (设置最大值: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

oracle入坑日记<六>自增列创建和清除(含序列和触发器的基础用法)的更多相关文章

  1. oracle入坑日记<四>表空间

    1   表空间是什么 1.1.数据表看做的货品,表空间就是存放货品的仓库.SQLserver 用户可以把表空间看做 SQLserver 中的数据库. 1.2.引用[日记二]的总结来解释表空间. 一个数 ...

  2. oracle入坑日记<三>用户详解(角色理解)

    1   用户是什么 1.1.权限管理是Oracle的精华,不同用户登录到同一数据库中,可能看到不同数量的表,拥有不同的权限.Oracle 的权限分为系统权限和数据对象权限,共一百多种.如果把Oracl ...

  3. oracle入坑日记<二>认识oracle(含sqlplus基础使用)

    1.SID(数据库实例) 1.1. oracle安装的时候有一项叫[全局数据库名]的填写项,这个就是oracle的SID也是数据库的唯一标识符: 1.2.一个oracle数据库有且只有一个SID(一般 ...

  4. oracle入坑日记<一> 安装

    学习日记系列(前辈/大神勿喷) 一.下载 下载地址:http://www.oracle.com/technetwork/cn/database/enterprise-edition/downloads ...

  5. oracle入坑日记<五>数据表

    1   数据表 1.1.数据表是存放数据字段信息的地方:在Oracle,数据表拥有者单位是用户,同时数据表属于表空间.如: 登录my_user用户在orcl表空间下创建的表就是 my_user用户在o ...

  6. Oracle自增列创建方法

    最近在做Oracle的项目,由于以前没有接触过Oracle的开发,遇到了不少的问题,比如给Oracle表添加自增列,与SQL Server就不同. Oracle没有自增字段这样的功能,但是通过触发器( ...

  7. cozmo 入坑日记及开发环境搭建

    前几日,朋友在群里发了一个机器人的小视频,视频里机器人可以对话,可以推箱子,开心以后会哈哈大笑,非常有趣. 详细了解里一下,这是个叫 cozmo 的智能机器人,可以配合 SDK 用 python 编程 ...

  8. Vue入坑日记: day - 01

    前言 最近做了一些小项目,小组里写前端的确实有点拉胯,于是自己动手写前端,因为大一学过web前端基础,所以对HTML,CSS还有印象,就直接对JS下手了,学了两天把JS大致搞明白了,顺便对JQuery ...

  9. web前端入坑第五篇:秒懂Vuejs、Angular、React原理和前端发展历史

    秒懂Vuejs.Angular.React原理和前端发展历史 2017-04-07 小北哥哥 前端你别闹 今天来说说 "前端发展历史和框架" 「前端程序发展的历史」 「 不学自知, ...

随机推荐

  1. Spring定义事物通知tx:advice

    <aop:config proxy-target-class="false">    <aop:advisor advice-ref="txAdvice ...

  2. Elasticsearch2.3.4使用手册(使用存储过程做增量同步的探索)

    一.工具安装 访问官网https://www.elastic.co/downloads/elasticsearch和http://xbib.org/repository/org/xbib/elasti ...

  3. 关于mysql设置外键,实现参照性完整性约束,以及workbench上的一个bug(?)

    一.本次数据库中有student,course,sc表,其设置情况 -- 创建course表 CREATE TABLE `course` ( `cno` ) NOT NULL, `cname` ) D ...

  4. 剑指offer7~10题

    斐波那契数列 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项. n<=39 思路:此题用递归会超内存,故直接循环. 代码: class Solution { pub ...

  5. Luminar 3 for Mac(照片编辑工具)v3.1.0中文特别版

    Luminar for Mac是一款多功能照片编辑软件,使用独特的AI工具加快速度,具备AI Sky Enhancer.Accent AI.太阳光线等创新功能.当然也保留了原有的功能,帮助你轻松的修复 ...

  6. 【DevExpress】GridView的RowClick事件禁用Checkbox选择的解决办法

    添加GridView的RowCellClick事件,代码如下 private void gvBoxMails_RowCellClick(object sender, DevExpress.XtraGr ...

  7. 通过Spark Streaming的foreachRDD把处理后的数据写入外部存储系统中

    转载自:http://blog.csdn.net/erfucun/article/details/52312682 本博文主要内容包括: 技术实现foreachRDD与foreachPartition ...

  8. OSPF Sham-Link配置示例

    在MPLS/VPN环境中,如果PE-CE之间使用OSPF交换路由信息,OSPF route将作为VPNv4 route(携带OSPF domain ID,OSPF Router ID,OSPF Rou ...

  9. Cookie 简单设置使用

    cookie的理解可以为,存放在用户浏览器上的一个文件,里面是键值对数据,用于跟服务端通讯.前端可以通过jquery cookie插件设置和读取,后端直接设置 1.获取Cookie: 1 2 3 4 ...

  10. pdf.js的使用

    下载地址:  files.cnblogs.com/zycjwdss/mypdf.zip 把下载后的zip解压,放到web服务器根目录下,打开pdf.html,把这一句取消注释: //window.pd ...