Oracle修改seuqnce当前值的三种方法

 更新时间:2026年03月05日 09:05:11   作者:潇湘隐者  
本文介绍了三种调整Oracle数据库序列当前值的方法,增加、减少序列当前值;直接使用SQL调整序列当前值;以及删除并重建序列,还讨论了序列越界的问题及其解决方法,以及不能修改序列初始值的注意事项,感兴趣的朋友跟随小编一起看看吧

在一些特殊场景(业务需求)可能需要修改序列(SEQUENCE)的当前值(CURRVAL)的大小, 有可能调大,也有可能调小, 这里简单介绍一下.

方法1

其实这种方法调整序列的当前值,其实就是增加或减少序列(SEQUENCE)的当前值, 语法如下

ALTER SEQUENCE SEQUENCE_NAME INCREMENT BY XXX; ----正数负数都可以

具体案例如下所示:

SQL> CREATE SEQUENCE SEQ_TEST
  2  INCREMENT BY 1
  3  START WITH 1
  4  MINVALUE 1 NOMAXVALUE
  5  NOCYCLE;
Sequence created.
SQL> SELECT SEQ_TEST.NEXTVAL FROM DUAL;
   NEXTVAL
----------
         1
SQL> /
   NEXTVAL
----------
         2
SQL> /
   NEXTVAL
----------
         3
SQL> /
   NEXTVAL
----------
         4
SQL> 
SQL> SELECT SEQ_TEST.CURRVAL FROM DUAL;
   CURRVAL
----------
         4
SQL> 

此时由于一些原因,想将序列SEQ_TEST的当前值调整为100, 那么要如何做呢?

SQL> ALTER SEQUENCE SEQ_TEST INCREMENT BY 96;
Sequence altered.
SQL> SELECT SEQ_TEST.CURRVAL FROM DUAL;
   CURRVAL
----------
         4
SQL> SELECT SEQ_TEST.NEXTVAL FROM DUAL;
   NEXTVAL
----------
       100
SQL> 
SQL> ALTER SEQUENCE SEQ_TEST INCREMENT BY -80;
Sequence altered.
SQL> SELECT SEQ_TEST.NEXTVAL FROM DUAL;
   NEXTVAL
----------
        20
SQL> 

方法2

如果数据库版本为12.1 或以上版本,可以使用下面SQL调整序列的当前值.

ALTER SEQUENCE <SEQUENCE_NAME> RESTART START WITH xxx;

例子:

SQL> ALTER SEQUENCE SEQ_TEST RESTART START WITH 200;
Sequence altered.
SQL> SELECT SEQ_TEST.NEXTVAL FROM DUAL;
   NEXTVAL
----------
       200
SQL> 
SQL> ALTER SEQUENCE SEQ_TEST RESTART START WITH 120;
Sequence altered.
SQL> SELECT SEQ_TEST.NEXTVAL FROM DUAL;
   NEXTVAL
----------
       120
SQL> 

这种方法相对于第一种方法更简洁与方便. 不需要你去计算增加或减少序列的大小值.

方法3

这种方法简单粗暴, 直接DROP掉序列,然后重建序列. 这里就不过多赘述了.

答疑解惑

问题1:

ORA-08004: sequence SEQ.NEXTVAL goes below MINVALUE and cannot be instantiated

SQL> DROP SEQUENCE SEQ_TEST;
Sequence dropped.
SQL> CREATE SEQUENCE SEQ_TEST
  2   INCREMENT BY 1
  3   START WITH 1
  4   MINVALUE 1 NOMAXVALUE
  5   NOCYCLE;
Sequence created.
SQL> SELECT SEQ_TEST.NEXTVAL FROM DUAL;
   NEXTVAL
----------
         1
SQL> /
   NEXTVAL
----------
         2
SQL> /
   NEXTVAL
----------
         3
SQL> ALTER SEQUENCE SEQ_TEST INCREMENT BY -20;
Sequence altered.
SQL> SELECT SEQ_TEST.NEXTVAL FROM DUAL;
SELECT SEQ_TEST.NEXTVAL FROM DUAL
       *
ERROR at line 1:
ORA-08004: sequence SEQ_TEST.NEXTVAL goes below MINVALUE and cannot be instantiated
SQL> 

出现这种问题,即序列的越界, 这种一般发生在向后递增,而且LAST_NUMBER小于MIN_VALUE的情况下.如下所示:

SQL> SET LINESIZE 255
SQL> COL SEQUENCE_OWNER FOR A16;
SQL> COL SEQUENCE_NAME FOR A30;
SQL> COL MAX_VALUE FOR 9999999999999999999999999999999999;
SQL> SELECT SEQUENCE_OWNER, SEQUENCE_NAME,MIN_VALUE,MAX_VALUE, LAST_NUMBER  
  2  FROM DBA_SEQUENCES
  3  WHERE SEQUENCE_NAME=UPPER(TRIM('&SEQUENCE_NAME'));
Enter value for sequence_name: SEQ_TEST
old   3: WHERE SEQUENCE_NAME=UPPER(TRIM('&SEQUENCE_NAME'))
new   3: WHERE SEQUENCE_NAME=UPPER(TRIM('SEQ_TEST'))
SEQUENCE_OWNER   SEQUENCE_NAME                   MIN_VALUE                           MAX_VALUE LAST_NUMBER
---------------- ------------------------------ ---------- ----------------------------------- -----------
SYS              SEQ_TEST                                1        9999999999999999999999999999         -17
SQL> 

其实如果你用第二种方法是不会遇到,它直接会出错并提示,而使用第一种方法则会遇到这种情况,你需要计算序列的当前值往后回退的过程中,它的值应该大于MIN_VALUE
还有一种报错是ORA-08004,超过MAXVALUE 无法实例化.这个是另外一种情况.

SQL> ALTER SEQUENCE SEQ_TEST RESTART START WITH -100;
ALTER SEQUENCE SEQ_TEST RESTART START WITH -100
*
ERROR at line 1:
ORA-04006: START WITH cannot be less than MINVALUE

问题2:

SQL> ALTER SEQUENCE SEQ START WITH 1000;
ALTER SEQUENCE SEQ START WITH 1000
                   *
ERROR at line 1:
ORA-02283: cannot alter starting sequence number

注意,不能修改序列的初始值,否则会报ORA-02283.如需所示:

$ oerr ora 02283
02283, 00000, "cannot alter starting sequence number"
// *Cause: Self-evident.
// *Action: Don't alter it.

The error ORA-02283: cannot alter starting sequence number occurs in Oracle when you attempt to directly modify the START WITH value of
an existing sequence. Oracle does not allow this operation for an already created sequence. However, there are workarounds to achieve the
desired result.

如果想修改序列的初始值,可以drop掉当前序列,然后重建序列.

到此这篇关于Oracle修改seuqnce的当前值(三种方法)的文章就介绍到这了,更多相关oracle修改seuqnce值内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Oracle实现查询前N条记录的两种方法

    Oracle实现查询前N条记录的两种方法

    在 Oracle 数据库中,查询表中的前 N 条记录是一个常见的需求,无论你是需要获取最新的几条数据,还是进行分页查询,掌握这一技巧都至关重要,本文将介绍两种常用的方法来检索 Oracle 表中的前 N 条记录,需要的朋友可以参考下
    2024-12-12
  • Oracle批量插入数据的三种方式【推荐】

    Oracle批量插入数据的三种方式【推荐】

    本文给大家带来三种oracle批量插入数据的方法,每种方法都是通过实例代码给大家介绍的非常详细,需要的朋友参考下吧
    2018-06-06
  • Oracle插入日期数据常见的2个问题和解决方法

    Oracle插入日期数据常见的2个问题和解决方法

    这篇文章主要介绍了Oracle插入日期数据常见的2个问题和解决方法,一个是提示无效的月份问题,一个是日期插入格式问题 ,需要的朋友可以参考下
    2014-07-07
  • ORCAL 临时创建表与删除表

    ORCAL 临时创建表与删除表

    今天这篇文章就来给大家分享ORCAL 临时创建表与删除表的相关资料,如会话级临时表是指临时表中的数据只在会话生命周期之中存在,当用户退出会话结束的时候,Oracle自动清除临时表中数据。下面就跟小编一起进入文章学习起来吧
    2021-10-10
  • oracle 安装与SQLPLUS简单用法

    oracle 安装与SQLPLUS简单用法

    安装oracle数据库成功之后,会显示相关的数据库信息
    2009-06-06
  • pl/sql导入、导出csv等格式文件详细步骤

    pl/sql导入、导出csv等格式文件详细步骤

    在 PL/SQL 开发中数据的导入和导出是常见的操作,下面这篇文章主要给大家介绍了关于pl/sql导入、导出csv等格式文件的详细步骤,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2024-04-04
  • Oracle给用户授权truncatetable的实现方案

    Oracle给用户授权truncatetable的实现方案

    这篇文章主要介绍了Oracle给用户授权truncatetable的实现方案,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-05-05
  • Oracle数据库聚合函数XMLAGG详解(全网最全)

    Oracle数据库聚合函数XMLAGG详解(全网最全)

    在SQL中,合函数用于对一组值进行计算并返回单一的值,这篇文章主要给大家介绍了关于Oracle数据库聚合函数XMLAGG的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-06-06
  • Oracle常用命令大全集

    Oracle常用命令大全集

    Oracle常用命令大全集...
    2007-03-03
  • Oracle 19c RAC 手工建库的搭建过程

    Oracle 19c RAC 手工建库的搭建过程

    这篇文章主要介绍了Oracle 19c RAC 手工建库搭建过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-01-01

最新评论