Migliore risposta
Proprio come il tuo indirizzo di casa identifica in modo univoco dove vivi, un Oracle ROWID identifica in modo univoco la posizione di una riga sul disco. Le informazioni in un ROWID forniscono a Oracle tutto ciò di cui ha bisogno per trovare la tua riga, il numero del disco, il cilindro, il blocco e loffset nel blocco.
Valori Rowid hanno diversi usi importanti:
- Sono il modo più veloce per accedere a una singola riga.
- Possono mostrarti come vengono memorizzate le righe in una tabella.
- Sono identificatori univoci per le righe in una tabella.
Non dovresti utilizzare Rowid come chiave primaria di una tabella. Se elimini e reinserisci una riga con le utilità di importazione ed esportazione, ad esempio, il suo rowid potrebbe cambiare. Se elimini una riga, Oracle potrebbe riassegnare il suo rowid a una nuova riga inserita in un secondo momento.
Anche se puoi utilizzare la pseudocolonna Rowid nella Seleziona e Dove di una query, questi valori della pseudocolonna non sono effettivamente memorizzati nel database. Non è possibile inserire, aggiornare o eliminare un valore della pseudocolonna Rowid.
Risposta
ROWID è la posizione fisica di una riga. Supponiamo di avere una tabella senza chiavi primarie. quindi questa tabella può avere righe duplicate. Come elimineresti le righe duplicate mantenendo esattamente una di quel tipo?
Oracle fornisce ROWID come una sorta di sostituto della chiave primaria. Puoi scrivere una query annidata di tipo correlato [(raggruppa per tutte le colonne nella riga e prendi MIN (ROWID) in ogni gruppo nella query interna, per ogni gruppo elimina le altre righe nel gruppo nella query esterna)] ..
ad esempio:
SQL> select * from employees;
SSN NAME
---------- ----------
1 john
1 john
2 john
2 john
10 sam
11 beth
11 beth
12 beth
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 john
2 john
2 john
10 sam
11 beth
12 beth
6 rows selected.