如何更改db序列的起始值

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


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

回答(2)

3 years ago

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

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

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

Here is the Oracle 10g documentation for ALTER SEQUENCE .

3 years ago

您无法更改普通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值时,第二个可能会做更多的工作,但是如果值越高,您可以看到第二个就会有更多的工作 .