おそらく非常に愚かな質問をしています:
Oracle db のテーブルに完全に重複したレコードがある可能性があります。すなわち:
DUP_TABLE:
NUMBER(8,0) field_A
NUMBER(8,0) field_B
このデータがあります:
field_A field_B
123 456
123 456
この場合、DB エンジンはこれらのレコードをどのように区別しますか?
おそらく非常に愚かな質問をしています:
Oracle db のテーブルに完全に重複したレコードがある可能性があります。すなわち:
DUP_TABLE:
NUMBER(8,0) field_A
NUMBER(8,0) field_B
このデータがあります:
field_A field_B
123 456
123 456
この場合、DB エンジンはこれらのレコードをどのように区別しますか?
Oracle (およびほとんどのリレーショナル データベース) では、重複する行を持つテーブルを作成できます。重複を除外する場合は、テーブルのすべての列にまたがる UNIQUE 制約を追加するだけです。
重複行が必要な場合は、テーブルにクエリを実行すると、DISTINCT 句または重複を単一のインスタンスに統合する何らかのグループ化がない限り、テーブルにあるのと同じ数のコピーが返されます。
Oracle は、各レコードを別の場所に保存し、内部で追跡しています。ユーザーは、ROWID FROM a_table を選択できます。その場所へのポインターを取得する必要がありますが、データベース設計が不適切であることを示している可能性があるため、最初にその理由を慎重に検討する必要があります。2 つのレコードを区別できるようにする場合は、それらを区別する情報?または、データベース管理のシーケンス番号は、ROWID よりも簡単にユーザーに伝えられる一意の番号を提供できます。
Oracle は、rowid
名前付きの列を暗黙的に各行に追加します。これを照会できますrowid
:
select rowid, field_A, field_B from DUP_TABLE;
から抽出するrowid
と、クエリされたレコードの物理ストレージに関する詳細情報を取得できます。
select DBMS_ROWID.ROWID_OBJECT(rowid) "OBJECT",
DBMS_ROWID.ROWID_RELATIVE_FNO(rowid) "FILE",
DBMS_ROWID.ROWID_BLOCK_NUMBER(rowid) "BLOCK",
DBMS_ROWID.ROWID_ROW_NUMBER(rowid) "ROW"
from DUP_TABLE;