Безопасно ли использовать rownum для обновления таблицы с увеличенными идентификаторами в Oracle?

Как и в MySql, я хочу обновить (заполнить) пустой столбец с инкрементными значениями - с Oracle. После

ALTER TABLE data ADD
(
  id  number
);

Я хочу для всех записей ID столбец для получения уникальных значений. После этого я включу Not Null и уникальные ограничения, чтобы сделать его первичным ключом.

Я быстро придумал

UPDATE TABLE data SET id = rownum;

но у меня плохое предчувствие по этому поводу. Это работает в моих тестах, как и ожидалось, но пример не является доказательством:-)

Безопасно ли использовать rownum таким образом, в update -заявление?

3 ответа

Решение

Да, у меня никогда не было проблем с этим методом, но включение ненулевых и уникальных ограничений не делает его первичным ключом - добавление ограничения первичного ключа делает его первичным ключом;)

Возможно, ваш метод безопасен. Если нет, вы будете уведомлены, если уникальное ограничение не будет выполнено:-).

Пуленепробиваемый метод заключается в следующем:

lock table data in exclusive mode;

merge into data t
using (select t.rowid rid, t.rownum id from data t) s
on (t.rowid = s.rid)
when matched then update set
  t.id = s.id;

commit;

Нет, это не безопасно, так как ROWNUM - псевдостолбец. Означает, что это не гарантирует последовательность, особенно при использовании с ORDER BY. Если необходимо, используйте ROW_NUMBER() OVER (ORDER BY your_field) вместо ROWNUM. Вы также можете использовать PL/SQL для обновления таблицы один раз в цикле.

Другие вопросы по тегам