を含むいくつかの列を取得しROWID
、後でROWID
更新する必要がある行を識別するために使用するクライアント アプリケーションを見ています。
update some_table t set col1=value1
where t.rowid = :selected_rowid
そうしても安全ですか?テーブルが変更されているROWID
ため、行を変更できますか?
を含むいくつかの列を取得しROWID
、後でROWID
更新する必要がある行を識別するために使用するクライアント アプリケーションを見ています。
update some_table t set col1=value1
where t.rowid = :selected_rowid
そうしても安全ですか?テーブルが変更されているROWID
ため、行を変更できますか?
「Oracle 8 から、ROWID
形式とサイズが 8 バイトから 10 バイトに変更されましたROWID
。テーブルを再編成またはエクスポート/インポートすると、 が変更されることに注意してください。パーティション化されたテーブルの場合、行がパーティションから別のパーティションに移行した場合にも変更されます。中の 1 つUPDATE
。」
http://www.orafaq.com/wiki/ROWID
いいえと思います。これは、たとえばアプリケーションがROWID
一時的に保存する場合 (たとえば、選択可能なアイテムのリストを生成し、それぞれが で識別されますROWID
が、リストは定期的に再生成され、保存されない場合) は安全です。しかし、ROWID
永続的な方法で使用される場合、安全ではありません。
ROWID
しばらく使用しているSELECT
こと、テーブルが標準のヒープ構成テーブルであり、DBA がテーブルに対して何もしていないこと (アプリケーションがオンラインである場合、これはかなり安全な仮定です) を想定しています。 )、ROWID
安定します。主キーを使用することが望ましいですが、主キーが使用できない場合、オラクルが開発した多くのツールとフレームワークがROWID
短期間使用します。ROWID
たとえば、ユーザーがデータをローカルで編集できるようにしてから、任意の長さの時間SELECT
後に master データベースと同期する場合などです。
ROWID
は行の物理的な位置にすぎないため、その位置が変更されると、 が変更されますROWID
。
ROWID
.INSERT
と同じものを使用するまったく異なるデータを持つデータを挿入する可能性があります。ROWID
ROWID
が変更される可能性があります。テーブルをエクスポートおよびインポートするとROWID
、たとえば変更されますが、新しいようなオンライン縮小コマンドのようなことも変更されます。ただし、これらの管理タスクは通常、アプリケーションが起動している間は実行されません。また、日中はほぼ確実に実行されません。しかし、DBA がこの種のことを行うときにアプリケーションがシャットダウンされていない場合、またはアプリケーションがデータを保持している場合、問題が発生する可能性があります。時間が経つにつれて、新しい機能が s に新しい変更の可能性をもたらすことがますます一般的になりましROWID
た。たとえば、索引構成表やオンライン圧縮オプションは比較的新しい機能です。将来的には、少なくとも がROWID
変更される可能性を伴う機能がさらに追加される可能性があります。
もちろん、厳密に言えば、主キーに依存するのも安全ではありません。他のセッションが来て、行を読み取った後に行の主キーを更新するか、行を選択した後に他のセッションが行を削除し、同じデータと異なる主キーを持つ新しい行を挿入する可能性は十分にあります。どちらの場合でも、データベースを使用するアプリケーションが実際に何をしていると想定されているかについて、ある程度のローカルな知識を持っていると役に立ちます。たとえば、主キーの更新を許可したり、主キーを再利用したりして、主キーを使用しても安全であると一般的に判断できるようにすることは、非常にまれです。同様に、パーティショニングの使用方法や、索引構成表での索引の定義方法によっては、更新が行われないと結論付けるのが比較的一般的です。ROWID
. たとえば、テーブルが によって分割されていることがわかっていて、LOAD_DATE
を更新しないことがわかっている場合、更新によるLOAD_DATE
への変更は実際には発生しませんROWID
。テーブルがインデックス構成されていることがわかっているが、そのインデックスの一部である列を更新していないことがわかっている場合ROWID
、UPDATE
.
そうするのは安全だとは思いません。理論的には変更されません。もちろん、誰かが「誤って」実際のDBで何かを削除するまでです...
PKを使用するだけで、はるかに理にかなっています。