Beste svaret
Akkurat som hjemmeadressen din unikt identifiserer hvor du bor, et Oracle ROWID identifiserer unikt hvor en rad ligger på disken. Informasjonen i en ROWID gir Oracle alt han trenger for å finne raden din, disknummeret, sylinderen, blokken og forskyvet i blokken.
Rowid-verdier har flere viktige bruksområder:
- De er den raskeste måten å få tilgang til en enkelt rad.
- De kan vise deg hvordan radene i en tabell er lagret.
- De er unike identifikatorer for rader i en tabell.
Du bør ikke bruke Rowid som den primære nøkkelen til en tabell. Hvis du for eksempel sletter og setter inn en rad med verktøyene Import og eksport, kan det hende at den blir endret. Hvis du sletter en rad, kan Oracle gi tildelingen av rowid til en ny rad som er satt inn senere.
Selv om du kan bruke Rowid-pseudokolonnen i Velg og Hvor ledd i et spørsmål, blir disse pseudokolonnverdiene faktisk ikke lagret i databasen. Du kan ikke sette inn, oppdatere eller slette en verdi av Rowid-pseudokolonnen.
Svar
ROWID er den fysiske plasseringen av en rad. Antar at du har en tabell uten primærnøkler. slik at denne tabellen kan ha dupliserte rader. Hvordan vil du slette dupliserte rader, men beholde nøyaktig en av den typen?
Oracle gir ROWID som en slags erstatning for primærnøkkel. Du kan skrive et nestet spørsmål som er av korrelert type [(gruppere etter alle kolonnene i raden og ta MIN (ROWID) i hver gruppe i det indre spørringen, for hver gruppe sletter du de andre radene i gruppen i ytterspørring)] ..
for eksempel:
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.