Beste antwoord
Net zoals uw thuisadres uniek identificeert waar u woont, kan een Oracle ROWID geeft op unieke wijze aan waar een rij zich op de schijf bevindt. De informatie in een ROWID geeft Oracle alles wat hij nodig heeft om uw rij, het schijfnummer, de cilinder, het blok en de offset in het blok te vinden.
Rowid-waarden hebben verschillende belangrijke toepassingen:
- Ze zijn de snelste manier om toegang te krijgen tot een enkele rij.
- Ze kunnen u laten zien hoe de rijen in een tabel worden opgeslagen.
- Het zijn unieke IDs voor rijen in een tabel.
Gebruik Rowid niet als de primaire sleutel van een tabel. Als u bijvoorbeeld een rij verwijdert en opnieuw invoegt met de hulpprogrammas voor importeren en exporteren, kan de rowid veranderen. Als u een rij verwijdert, kan Oracle zijn rowid opnieuw toewijzen aan een nieuwe rij die later wordt ingevoegd.
Hoewel u de Rowid-pseudokolom in de Selecteer en Waar clausule van een query, deze pseudokolumnwaarden worden niet daadwerkelijk in de database opgeslagen. U kunt een waarde van de Rowid-pseudokolom niet invoegen, bijwerken of verwijderen.
Antwoord
ROWID is de fysieke locatie van een rij. Stel dat u een tabel heeft zonder primaire sleutels. dus deze tabel kan dubbele rijen hebben. Hoe zou u dubbele rijen verwijderen maar precies één van die rijen behouden?
Oracle biedt ROWID als een soort vervanging voor de primaire sleutel. U kunt een geneste query schrijven die van het gecorreleerde type is [(groepeer op alle kolommen in de rij en neem MIN (ROWID) in elke groep in de innerlijke query, verwijder voor elke groep de andere rijen in de groep in de buitenquery)] ..
bijvoorbeeld:
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.