我的要求如下。 (a)我已经创建了序列,并且有一个表(假设员工有id,name..etc)。 (b)我的序列如何被破坏,当前序列的当前值与employee表的id列的最大值不同步。
现在我想将我的序列重置为employee表的id列的最大值。我知道我们可以通过使用PL / SQL,存储过程轻松完成。但我想写简单的查询,它将执行以下任务。 1-获取id的最大值和我的序列的当前值。取一个差值,并使用increment by将此差异添加到序列中。(此处我的序列的当前值小于id列的最大id值)
答案 0 :(得分:0)
使用'ALTER SEQUENCE'命令更改序列的值。
要使用新的基值重新启动序列,您需要删除并重新创建它。
我认为你不能用简单的SELECT查询来做到这一点。
答案 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'
);
如果现有ID值较低,则第二个可能会执行更多工作,但是如果值较高,则可以看到第二个值稍微有点。