Warum ROWID in Oracle verwenden?


Beste Antwort

So wie Ihre Heimatadresse eindeutig angibt, wo Sie leben, ist ein Oracle ROWID identifiziert eindeutig, wo sich eine Zeile auf der Festplatte befindet. Die Informationen in einer ROWID geben Oracle alles, was es braucht, um Ihre Zeile, die Plattennummer, den Zylinder, den Block und den Offset im Block zu finden.

Rowid-Werte haben mehrere wichtige Verwendungszwecke:

  • Sie sind der schnellste Weg, um auf eine einzelne Zeile zuzugreifen.
  • Sie können Ihnen zeigen, wie die Zeilen in einer Tabelle gespeichert werden.
  • Sie sind eindeutige Bezeichner für Zeilen in einer Tabelle.

Sie sollten Rowid nicht als Primärschlüssel einer Tabelle verwenden. Wenn Sie beispielsweise eine Zeile mit den Dienstprogrammen Import und Export löschen und erneut einfügen, kann sich die Zeilen-ID ändern. Wenn Sie eine Zeile löschen, weist Oracle die Zeilen-ID möglicherweise einer neuen Zeile zu, die später eingefügt wird.

Obwohl Sie die Rowid-Pseudospalte in der Select und Wobei -Klausel einer Abfrage diese Pseudospaltenwerte nicht tatsächlich in der Datenbank gespeichert sind. Sie können keinen Wert der Rowid-Pseudospalte einfügen, aktualisieren oder löschen.

Antwort

ROWID ist der physische Speicherort einer Zeile. Angenommen, Sie haben eine Tabelle ohne Primärschlüssel. Diese Tabelle kann also doppelte Zeilen enthalten. Wie würden Sie doppelte Zeilen löschen, aber genau eine dieser Arten beibehalten?

Oracle bietet ROWID als Ersatz für den Primärschlüssel an. Sie können eine verschachtelte Abfrage vom korrelierten Typ schreiben [(nach allen Spalten in der Zeile gruppieren und in jeder Gruppe in der inneren Abfrage MIN (ROWID) verwenden, für jede Gruppe die anderen Zeilen in der Gruppe in der äußeren Abfrage löschen)] ..

zum Beispiel:

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.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.