2014-12-19 42 views
2

我的要求如下。 (a)我已经创建了序列,一张表是(让我们假设员工有id,name ..等等)。 (b)一些如何破坏我的序列,并且当前序列的值与雇员表的id列的最大值不同步。如何更改db序列起始值


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

+0

取决于您使用哪个数据库管理系统,sqlserver,mysql或其他? – Pseudonym

+0

您想重置一次或在每次插入记录时查找最大的ID? –

+0

@由于OP询问[tag:plsql],所以假设他的意思是[tag:oracle]是安全的。 – Mureinik

回答

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值较低,第二个可能会做更多的工作,但如果值较高,则可以看到第二个进入自己的位置。

+0

谢谢你的回复,但我有以下问题,而使用这种方法。 1-在第一种方法中,问题发生如下(例如:当前seq。当前值= 12,最大id = 20。理想情况下它应该设置当前值= 20,但根据分析发现,作为级别值开始于1如此条件(1 <20)插入2o顺序记录和此方法失败 2-在第二,我可以更新只有单个值,我可以通过seq.next val简单做(注意:如果我们可以设置级别值= 12 [seq当前值然后这将成功]) 高级谢谢! –

+0

@SaurabhGupta - 想要将序列设置为20意味着你不想在你的ID中出现空缺,但序列无论如何都不是无缝隙的,所以我不确定为什么'失败'。在这两种情况下,序列的结果可能会高于旧的最大ID(可能在第一个版本中要高得多;在第二个版本中可能要高得多),而在第二个版本中cache_size可能会更高。使用这些值时,第一个结果为30,第二个结果为31,第二个结果为31.不清楚'我只能更新单个值'的含义,因为nextval仍然被connect-by多次调用。 –

+0

1-让我们举一个例子 Seq.currval = 12 Max(id)= 20 现在,如果我继续第一种方法,那么我们已经指定条件为通过级别连接