热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

oracle入坑日记六自增列创建和清除(含序列和触发器的基础用法)

0 前言用过SQLserver和MySQL的自增列(auto_increment),然而Oracle 在建表设置列时却没有自增列。查阅资料后发现Oracle的自增列需要手动编写。1
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 ;

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

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 的变化)。

  初创序列时的数据情况

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

  当调用一次 nextval 后

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

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

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

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

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

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

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; 

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

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

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

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

  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入坑日记<六>自增列创建和清除(含序列和触发器的基础用法)

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

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

壹、oracle入坑日记<一> 安装

 

贰、oracle入坑日记<二>认识oracle

 

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

 

肆、oracle入坑日记<四>表空间

 

伍、oracle入坑日记<五>数据表

 

陆、oracle入坑日记<六>自增列创建和清除(含序列和触发器的基础用法)


推荐阅读
  • 如何在不同数据库中提取前N%的记录
    本文详细介绍了如何在SQL Server、Oracle和MySQL等不同数据库中提取前N%的记录。通过具体的示例和代码,帮助读者理解和掌握这些方法。 ... [详细]
  • 包含phppdoerrorcode的词条 ... [详细]
  • 在什么情况下MySQL的可重复读隔离级别会导致幻读现象? ... [详细]
  • 本文介绍了如何在 Spring Boot 项目中使用 spring-boot-starter-quartz 组件实现定时任务,并将 cron 表达式存储在数据库中,以便动态调整任务执行频率。 ... [详细]
  • Nacos 0.3 数据持久化详解与实践
    本文详细介绍了如何将 Nacos 0.3 的数据持久化到 MySQL 数据库,并提供了具体的步骤和注意事项。 ... [详细]
  • Docker 环境下 MySQL 双主同步配置指南
    本文介绍了如何在 Docker 环境中配置 MySQL 的双主同步,包括目录结构的创建、配置文件的编写、容器的创建与设置以及最终的验证步骤。 ... [详细]
  • 本文详细介绍了Java代码分层的基本概念和常见分层模式,特别是MVC模式。同时探讨了不同项目需求下的分层策略,帮助读者更好地理解和应用Java分层思想。 ... [详细]
  • DAO(Data Access Object)模式是一种用于抽象和封装所有对数据库或其他持久化机制访问的方法,它通过提供一个统一的接口来隐藏底层数据访问的复杂性。 ... [详细]
  • Python 数据可视化实战指南
    本文详细介绍如何使用 Python 进行数据可视化,涵盖从环境搭建到具体实例的全过程。 ... [详细]
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • 从0到1搭建大数据平台
    从0到1搭建大数据平台 ... [详细]
  • 如何在Java中使用DButils类
    这期内容当中小编将会给大家带来有关如何在Java中使用DButils类,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。D ... [详细]
  • 本文总结了在SQL Server数据库中编写和优化存储过程的经验和技巧,旨在帮助数据库开发人员提升存储过程的性能和可维护性。 ... [详细]
  • 本文详细介绍了MySQL数据库的基础语法与核心操作,涵盖从基础概念到具体应用的多个方面。首先,文章从基础知识入手,逐步深入到创建和修改数据表的操作。接着,详细讲解了如何进行数据的插入、更新与删除。在查询部分,不仅介绍了DISTINCT和LIMIT的使用方法,还探讨了排序、过滤和通配符的应用。此外,文章还涵盖了计算字段以及多种函数的使用,包括文本处理、日期和时间处理及数值处理等。通过这些内容,读者可以全面掌握MySQL数据库的核心操作技巧。 ... [详细]
  • 本文旨在解决 MySQL 无法连接到 localhost 的常见问题,并提供详细的步骤来确保 MySQL 服务正确启动和配置。 ... [详细]
author-avatar
早晚虚文_114
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有