如何更改db sequence起始值

时间:2014-12-19 15:13:08

标签: sql oracle

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


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

2 个答案:

答案 0 :(得分:0)

使用'ALTER SEQUENCE'命令更改序列的值。

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

我认为你不能用简单的SELECT查询来做到这一点。

Here is the Oracle 10g documentation for ALTER SEQUENCE

答案 1 :(得分:0)

由于alter sequence是DDL,因此无法从普通SQL更改增量,因此需要逐个递增多次。这会使序列增加的次数是您当前拥有的最高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值较低,则第二个可能会执行更多工作,但是如果值较高,则可以看到第二个值稍微有点。