2011-11-08 71 views
3

我在http://haacked.com/archive/2004/02/28/sql-auto-increment.aspx上发现了以下方法,但PL/SQL没有运气。有什么想法吗?增加变量的PL/SQL更新

update table  
set table.column = var1 = var1 + 1  
where table.column2 = "value'; 

它似乎不喜欢VAR1的递增下半年OD的集线

+0

我应该提到,通过查找此表中的table.column的最大值来设置上面的var1。 – typhoid

+0

还有一个类似的问题[这里](http://stackoverflow.com/questions/4749669/variable-manipulation-in-oracle/4751469#4751469)。 – Allan

回答

1

这可能会更好地为您:

update table 
set table.column = table.column + 1 
where table.column2 = "value'; 

听起来像是你需要的是什么@沃尔夫说,一个序列。否则你可以这样做:

update table 
set table.column = 
    (select max(table.column) + 1 
    from table) 
where table.column2 = "value'; 

希望column2值是唯一的,否则你会得到重复。

+0

对不起,我不能这样做,因为table.column中的当前值不唯一。这种方法只会增加他们的价值一步。我真正需要的是让每个记录的所有列值都具有唯一性的特殊列(其中column2 =“value”)。 – typhoid

+1

@typhoid:在这种情况下,我不确定你的具体需求是什么,但是你有没有考虑过使用序列?一个序列可以保证您的唯一值,而无需查找最大值的开销。如果您还需要使'table.column'和'table.column2'组合为唯一的,那么您还应该考虑为这对列添加唯一约束。 – Wolf

2

一点PL/SQL来保存原始的最大ID。使用ROWNUM解决增加计的问题:

declare 
    n pls_integer; 
begin 
    select max(col1) 
    into n 
    from your table; 

    update your_table 
    set col1 = n + rownum 
    where col2 = 'value'; 
end; 

这会给你一个唯一的ID为COL1它不会碰撞COL1 COL2为其他值。

2

根据您所提供的链接是怎么回事,我想你真正想要的是这样的:

update your_table  
set your_table.column = rownum 
where your_table.column2 = 'value'; 

这将在表中的“价值”的每一行设置为一个唯一的整数开始, 1.这些值只对该值唯一。您可以将rownum添加到当前的最大值,以将它们设置为大于任何现有值(如在@ APC的答案中所见)。

需要注意的是,如果在该列上有多次插入和/或更新的可能性同时发生,这是不安全的(也就是说,将其作为一次性修复可能是可以的,但它不应该是一个常规例程(当然不应该用于代码中))。在这种情况下,你一定要使用一个序列。