Безопасно ли использовать 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 для обновления таблицы один раз в цикле.