PL / SQL Update, который увеличивает переменную - PullRequest
4 голосов
/ 08 ноября 2011

Я нашел следующий подход на 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 во второй половине заданной строки

Ответы [ 3 ]

2 голосов
/ 08 ноября 2011

Немного PL / SQL для хранения исходного максимального идентификатора. Использование 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, который не будет конфликтовать с COL1 для другого значения COL2.

2 голосов
/ 08 ноября 2011

Исходя из того, что происходит в указанной вами ссылке, я думаю, что вы действительно хотите это:

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

При этом каждая строка в таблице для «значения» будет иметь уникальное целое число, начиная с 1. Однако значения будут уникальными только для этого значения. Вы можете добавить rownum к текущему максимальному значению, чтобы установить их все больше, чем любые существующие значения (как видно из ответа @ APC).

Следует отметить, что это небезопасно, если есть вероятность, что несколько вставок и / или обновлений в этом столбце будут происходить одновременно (то есть, вероятно, это можно сделать как одноразовое исправление, но это не следует делать). обычная процедура (и, конечно, не должна использоваться в коде)). В этом случае вам определенно следует использовать последовательность.

1 голос
/ 08 ноября 2011

Это может работать лучше для вас:

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 уникальны, иначе вы получите дубликаты.

...