2015-04-21 4 views
0

Согласно Oracle DocumentationПочему мы не можем использовать ROWID в качестве первичного ключа?

Вы не должны использовать ROWID в качестве первичного ключа таблицы. Если вы удалите и вставьте строку с помощью утилит импорта и экспорта, например, , то ее значение может измениться. Если вы удалите строку, то Oracle может переназначить свой rowid новой строке, вставленной позже.

Я не понял фактическую причину. Означает ли это, что когда мы используем утилиты импорта/экспорта, тогда мы не должны использовать ROWID в качестве первичного ключа, или мы никогда не должны использовать ROWID в качестве первичного ключа?

Как объяснялось выше, когда мы удаляем строку и снова вставляем, то тот же ROWID может получить назначение, но с другой стороны строка уже была удалена, поэтому не будет никакой проблемы, если мы получим такой же ROWID. Не так ли? Может ли кто-нибудь объяснить это на каком-то примере?

+0

В сценарии удаления представьте, что происходит со всеми данными в других таблицах, которые ссылаются на исходную строку по ее rowid. – Mat

+0

Если мы использовали 'cascade delete', то? – Ravi

+0

Да. Или если у вас есть данные в другой системе, которая использует одну и ту же ссылку. И сценарий экспорта/импорта не является единственным, который вызывает изменения в строке. Также перемещаются таблицы («reorg»). – Mat

ответ

1

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

Также, если вы удалите одну запись, вам может быть присвоена новая запись, содержащая ROWID. Также вы должны понимать, что ROWID не сохраняется в процессе EXPORT и IMPORT базы данных.

От here

Если строки перемещаются, то ROWID изменится. Строки могут перемещаться из-за операций технического обслуживания, таких как усадки и перемещения стола. В результате хранение ROWID в течение длительных периодов времени - плохая идея. Они должны использоваться только в одной транзакции, предпочтительно как часть SELECT ... ДЛЯ ОБНОВЛЕНИЯ, где строка заблокирована, предотвращая движение строки.

+0

Но, по-видимому, это может произойти только в том случае, если включено «включить перемещение строк» ​​... – Worthy7

0

Мы никогда не должны использовать ROWID в качестве первичных ключей для постоянных и важных для бизнеса данных.

ROWID - технический адрес строки. Есть несколько scenarious когда

а) ROWID из существующих записей будет изменен

б) различные записи будут иметь один и тот же ROWID.

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

Клавиши ROWID могут использоваться для ненужных временных данных, таких как таблицы исключений или для краткосрочной навигации, например, в пункте WHERE CURRENT OF.