如何更改db序列的起始值

loading...


2

我的要求如下 . (a)我已经创建了序列,并且有一个表(假设员工有id,name..etc) . (b)我的序列如何被破坏,当前序列的当前值与employee表的id列的最大值不同步 .


现在我想将我的序列重置为employee表的id列的最大值 . 我知道我们可以通过使用PL / SQL,存储过程轻松完成 . 但我想写简单查询,它将执行以下任务 . 1-获取id的最大值和我的序列的当前值 . 取一个差值,并使用increment by将这个差值添加到序列中 . (此处我的序列的当前值小于id列的最大id值)

2回答

  • 0

    您可以使用'ALTER SEQUENCE'命令更改序列的值 .

    要使用新的基值重新启动序列,您需要删除并重新创建它 .

    我不认为你可以通过简单的SELECT查询来做到这一点 .

    Here is the Oracle 10g documentation for ALTER SEQUENCE .


  • 0

    您无法更改普通SQL的增量,因为 alter sequence 是DDL,因此您需要逐个递增多次 . 这会将序列增加的次数与您当前拥有的最高ID一样多:

    select your_sequence.nextval
    from (
      select max(id) as max_id
      from your_table
    ) t
    connect by level < t.max_id;
    

    SQL Fiddle demo(如果在缓存模式时序列未重置,则稍微捏一下) .

    如果你有一个很高的值,虽然这可能是低效的,但作为一次性调整,可能没有引用子查询或CTE中的当前序列值,但你可以查看 USER_SEQUNECES 视图以获得粗略的指导你要开始多远,并将调用次数减少到案例大小的两倍(取决于缓存持有的等待值的数量):

    select your_sequence.nextval
    from (
      select max(id) as max_id
      from your_table
    ) t
    connect by level <= (
      select t.max_id + us.cache_size + 1 - us.last_number
      from user_sequences us
      where sequence_name = 'YOUR_SEQUENCE'
    );
    

    SQL Fiddle .

    使用较低的现有ID值时,第二个可能会做更多的工作,但是如果值越高,您可以看到第二个就会有更多的工作 .

loading...

评论

暂时没有评论!