ROWID (оракул) - какое-либо использование для него?

Мое понимание - то, что ROWID является уникальным значением для каждой строки в результате, возвращенном запросом.

Почему нам нужен этот ROWID? В Oracle уже существует ROWNUM.

Кто-либо использовал ROWID в SQL-запросе?

35
задан UnbearableLightness 2 October 2018 в 08:27
поделиться

5 ответов

ROWID - это физическое расположение строки. Следовательно, это самый быстрый способ найти строку, даже быстрее, чем поиск по первичному ключу. Таким образом, это может быть полезно в определенных типах транзакций, когда мы выбираем некоторые строки, сохраняем их ROWID, а затем используем ROWID в where предложениях DML для тех же строк.

Синтаксис Oracle SELECT ... FOR UPDATE неявно использует ROWID, когда мы обновляем заблокированную строку с помощью WHERE CURRENT OF. Также таблица EXCEPTIONS (на которую ссылается при применении ограничений с предложением EXCEPTIONS INTO) имеет столбец ROW_ID. Это позволяет нам быстро идентифицировать строки, которые нарушают наше ограничение.

Этот последний пример указывает на другое общее использование: когда мы пишем некий общий фрагмент кода и нам нужен механизм для хранения UID, не беспокоясь о типе данных, составных ключах и т. Д.

ROWNUM, с другой стороны, является псевдо -column, который помечает строку в данном наборе результатов. Это не имеет постоянного значения.

править

ROWID для данной записи может изменяться в течение жизненного цикла системы, например, при перестроении таблицы. Также, если одна запись будет удалена, новой записи может быть присвоен этот ROWID. Следовательно, ROWID не подходят для использования в качестве UID в долгосрочной перспективе. Но они достаточно хороши для использования в транзакции.

44
ответ дан 27 November 2019 в 06:59
поделиться

ROWID однозначно идентифицирует строку в таблице. ROWNUM дает вам номер строки результата для определенного запроса. Они очень разные и не взаимозаменяемы.

Также существует ROW_NUMBER, более современная версия ROWNUM, которая ведет себя немного иначе. Прочтите эту статью , в которой объясняется разница.

3
ответ дан 27 November 2019 в 06:59
поделиться

Теперь я знаю пример для этого.

предположим, что у вас есть таблица без первичных ключей.поэтому в этой таблице могут быть повторяющиеся строки. Как бы вы удалили повторяющиеся строки, но оставили ровно одну такую?

Oracle предоставляет ROWID как своего рода замену первичному ключу. Вы можете написать вложенный запрос коррелированного типа [(сгруппировать по всем столбцам в строке и взять MIN (ROWID) в каждой группе во внутреннем запросе, для каждой группы удалить другие строки в группе во внешнем запросе)]

Пример

SQL> select * from employees;

       SSN NAME
---------- ----------
         1 helen
         1 helen
         2 helen
         2 peter
        10 sally
        11 null
        11 null
        12 null

8 rows selected.

SQL> delete from employees where ROWID NOT IN (select min(ROWID) from employees
group by ssn,name);

2 rows deleted.

SQL> select * from employees;

       SSN NAME
---------- ----------
         1 helen
         2 helen
         2 peter
        10 sally
        11 null
        12 null

6 rows selected.
12
ответ дан 27 November 2019 в 06:59
поделиться

ROWID позволяет иметь две строки с одинаковыми данными. Хотя обычно вы хотите, чтобы ваш первичный ключ был немного более значимым, чем RowID, это всего лишь простой способ автоматического обеспечения уникальности между строками.

0
ответ дан 27 November 2019 в 06:59
поделиться

обратите внимание, что ROWID не сохраняется в течение цикла EXPORT и IMPORT базы данных. вы НИКОГДА не должны хранить rowid в своих таблицах в качестве ключевого значения.

6
ответ дан 27 November 2019 в 06:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: