Генерация значений первичного ключа после добавления нового столбца в таблицу Oracle - PullRequest
0 голосов
/ 20 июня 2011

У меня есть таблица с 2 столбцами varchar2. Я добавил новый столбец чисел в существующую таблицу, чтобы сделать этот столбец первичным ключом. Эта таблица теперь включает 3 столбца. Я дал попробовать использовать анонимный блок следующим образом: <br> declare<br> cnt number;<br> begin<br> select nvl(count(*),0) into cnt from sometable;<br> for i in 1..cnt<br> loop<br> update sometable set id=i where i=rownum;<br> end loop;<br> end;<br>
При использовании этого анонимного блока эта таблица неожиданно обновляется.
Моим решением было использовать следующее утверждение:
create table sometablecopy as select row_number() over(order by sometable.col1) as id, sometable.* from sometable;
Тем не менее меня интересует, почему анонимный блок не выдает ожидаемые значения первичного ключа с помощью псевдостолбца rownum? Это должно быть связано с rownum.

Ответы [ 2 ]

1 голос
/ 20 июня 2011

Rownum - псевдоколонка. Он присваивается строкам, когда они возвращаются из выбора. Таким образом, вы не можете сказать «выбрать * из my_table, где rownum = 42», поскольку строка с rownum = 42 еще не определена, она будет меняться в зависимости от вашего выбора и предиката (и «выбрать * из my_table, где rownum = 1 "вернет одну строку, а не" первую "строку, что бы это ни было). Вы можете сделать что-то вроде (не проверено):

declare
  cursor sel_cur is
  select rowid as row_id
  from my_table
  order by orderby_col;

  v_ctr pls_integer := 0;
begin
  for rec in sel_cur
  loop
    v_ctr := v_ctr + 1;
    update my_table set pk_col = v_ctr where rowid = rec.row_id;
  end loop;
  commit;
exception
  when others then 
  rollback;
  raise;
end;

Предполагается, что у вас достаточно отката для обновления всей таблицы.

Надеюсь, это поможет.

1 голос
/ 20 июня 2011

Вы не можете использовать ROWNUM подобным образом (см. ROWNUM в SQL ).

Что вы могли бы сделать так:

UPDATE sometable SET id = ROWNUM;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...