【问题标题】:PL/SQL Update that increments a variable增加变量的 PL/SQL 更新
【发布时间】:2011-11-08 15:25:34
【问题描述】:

我在http://haacked.com/archive/2004/02/28/sql-auto-increment.aspx 上找到了以下方法,但对 PL/SQL 没有运气。有什么想法吗?

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

似乎不喜欢在设置线的后半段增加 var1

【问题讨论】:

  • 我应该提到var1是通过在这个表中找到table.column的最大值来设置的。
  • 有一个类似的问题here

标签: sql oracle variables plsql sql-update


【解决方案1】:

一些 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;

这将为您提供 COL1 的唯一 ID,该 ID 不会与 COL2 的其他值发生冲突。

【讨论】:

    【解决方案2】:

    根据您提供的链接中发生的情况,我认为您真正想要的是:

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

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

    应该注意,如果此列上可能同时发生多个插入和/或更新(即一次性修复可能没问题,但不应该),这样做是不安全的一个常规的例程(当然不应该在代码中使用))。在这种情况下,您绝对应该使用序列。

    【讨论】:

      【解决方案3】:

      这可能更适合您:

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

      听起来你需要的是@Wolf 所说的,一个序列。否则你可以这样做:

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

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

      【讨论】:

      • 对不起,我不能这样做,因为 table.column 中的当前值不是唯一的。这种方法只会将它们的值增加一步。我真正需要的是一种使这些特定列(其中 column2 = "value")在每条记录的所有列值中唯一的方法。
      • @typhoid:我不确定在这种情况下您的具体需求是什么,但您是否考虑过使用序列?序列可确保您的值是唯一的,而不会产生查找最大值的开销。如果您还需要使 table.columntable.column2 组合唯一,那么您还应该考虑为这对列添加唯一约束。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-03
      • 1970-01-01
      • 2016-04-22
      • 2016-02-18
      • 2015-10-01
      相关资源
      最近更新 更多