Cel mai bun răspuns
La fel cum adresa dvs. de domiciliu identifică în mod unic unde locuiți, un Oracle ROWID identifică în mod unic unde se află un rând pe disc. Informațiile dintr-un ROWID oferă Oracle tot ce are nevoie pentru a găsi rândul dvs., numărul discului, cilindrul, blocul și decalajul în bloc.
Valorile Rowid au mai multe utilizări importante:
- Sunt cel mai rapid mod de a accesa un singur rând.
- Vă pot arăta cum sunt stocate rândurile dintr-un tabel.
- Sunt identificatori unici pentru rândurile dintr-un tabel.
Nu ar trebui să utilizați Rowid ca cheie principală a unui tabel. Dacă ștergeți și reintroduceți un rând cu utilitarele Import și Export, de exemplu, atunci rândul său se poate modifica. Dacă ștergeți un rând, atunci Oracle poate reatribui rândul său la un rând nou inserat ulterior.
Deși puteți utiliza pseudocoluna Rowid în Selectați și În cazul în care clauza unei interogări, aceste valori pseudocolumn nu sunt de fapt stocate în baza de date. Nu puteți insera, actualiza sau șterge o valoare a pseudocoloanei Rowid.
Răspuns
ROWID este locația fizică a unui rând. Presupunem că aveți tabel fără chei primare. deci acest tabel poate avea rânduri duplicate. Cum ați șterge rândurile duplicate, dar păstrați exact unul de acest gen?
Oracle oferă ROWID ca un fel de substitut pentru cheia primară. Puteți scrie o interogare imbricată care este de tip corelat [(grupați după toate coloanele din rând și luați MIN (ROWID) în fiecare grup din interogarea interioară, pentru fiecare grup ștergeți celelalte rânduri din grupul din exteriorul interogării)] ..
de exemplu:
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.