it-swarm.com.de

Was ist das Key Preserved Table-Konzept?

Ich habe in der Oracle-Dokumentation über die Tabelle mit Schlüsselerhaltung im Abschnitt Aktualisieren der Verknüpfungsansichten gelesen.

Ich fand es jedoch nicht einfach, es zu verstehen.

Ich hoffe, einige einfache konzeptionelle Details außer der offiziellen Oracle-Dokumentation zu erhalten.

12
parmanand

Schlüssel erhalten bedeutet, dass 1 Schlüsselwert an 1 Tabelle geht. Wenn Sie Gegenbeispiele angeben, können Sie dieses Konzept möglicherweise besser verstehen.

Beispiel1 :

Ihre Ansicht enthält Aggregation. Angenommen, Sie haben die folgende Ansichtsstruktur.

GroupID, AverageSalary
1 , 10000
2, 12000
3, 14000

In diesem Beispiel: Ihre Werte stammen aus mehr als einer Zeile. Wenn Sie versuchen, AverageSalary in dieser Ansicht zu aktualisieren, kann die Datenbank nicht finden, WELCHE Zeilen aktualisiert werden sollen.

Beispiel2 : Ihre Ansicht zeigt Werte aus mehr als einer Tabelle. Ihre Ansicht zeigt Werte aus der Tabelle PERSON und PERSON_CONTACT_DETAILS (ID, PersonID, ContactType, ContactValue).

Beispielzeilen:

 1,1,email,[email protected]
 1,1,phone,898-98-99

Sie schließen sich dieser Tabelle an und zeigen weitere geschäftsfreundliche Informationen an.

PersonId, Name, Nachname, Telefon1, E-Mail1

Hier möchten Sie Phone1 und Email1 aktualisieren. In diesem Beispiel kann Ihre personID jedoch zwei verschiedenen Zeilen zugeordnet sein, möglicherweise mehr Zeilen. Auch in dieser Ansicht kann die Datenbank nicht finden, WELCHE Zeilen aktualisiert werden sollen.

Hinweis: Wenn Sie Ihre Ansichts-SQL einschränken und klar machen, welche Zeilen aktualisiert werden sollen, funktioniert dies möglicherweise.

Diese beiden Beispiele sind erste Beispiele, die mir in den Sinn kommen. Sie können erhöht werden. Aber das Konzept ist klar. Die Datenbank muss 1 Schlüsselwert einer Tabelle zuordnen. Zum Beispiel haben Sie eins zu eins PERSON, PERSON_DETAILS Tabellen. Hier funktioniert das Anzeigen und Aktualisieren, da es eins zu eins ist.

7
Atilla Ozgur

Die Dokumentation , die Sie bereits gelesen haben, sagt es ziemlich gut. Um es weiter zu erklären:

Das Konzept einer schlüsselerhaltenen Tabelle ist von grundlegender Bedeutung für das Verständnis der Einschränkungen beim Ändern von Verknüpfungsansichten.

Normalerweise wirkt ein update auf eine einzelne Tabelle. Um umständliche Unterabfragen im Filter zu vermeiden, können Sie mit Oracle eine Ansicht (oder Unterabfrage) update erstellen, solange die vorgenommenen Änderungen noch problemlos auf echte zugrunde liegende Zeilen in einer Tabelle abgebildet werden können. Dies ist möglich, wenn die Klausel set nur Spalten in einer Tabelle "Schlüssel beibehalten" ändert:

Eine Tabelle bleibt schlüsselerhalten, wenn jeder Schlüssel der Tabelle auch ein Schlüssel des Ergebnisses des Joins sein kann. Bei einer schlüsselerhaltenen Tabelle werden die Schlüssel also über einen Join erhalten.

Zum Beispiel:

create table foo( foo_id integer primary key, foo_val integer not null );
create table bar( bar_id integer primary key, bar_val integer not null, 
                  foo_id integer not null references foo );

update (select * from foo join bar using(foo_id)) set foo_val=1;
ORA-01779: cannot modify a column which maps to a non key-preserved table

update (select * from foo join bar using(foo_id)) set bar_val=1;
0 rows updated.

das erste Update schlägt fehl, da Oracle keine Möglichkeit hat, foo_val in der Abfrage foo_val in foo 1: 1 zuzuordnen. Umgekehrt ist das zweite Update erfolgreich, da Oracle 1: 1 zuordnen kann jedes bar_val bis bar_val in bar. Wichtig ist, dass foo_id In foo eindeutig ist. Für jede Zeile in bar kann es also höchstens eine entsprechende Zeile in foo geben ( tatsächlich genau 1 in diesem Beispiel, aber das gleiche gilt für einen nullbaren Fremdschlüssel - der Punkt ist, dass es nie mehr als eine Zeile gibt).

Lassen Sie mich zuerst ein Beispiel geben und es später erklären. Betrachten Sie 2 Tabellen Studenten (t_students) und Kurs (t_course).

  • Die Schülertabelle (stundentid, name, courseid) enthält einen Primärschlüssel für den Studentenausweis.
  • Die Kurstabelle (Kurs-ID, Kursname) enthält einen Primärschlüssel für die Kurs-ID.

Wenn diese beiden Tabellen verbunden sind ->

select * from t_students S, t_course C where S.courseid=C.courseid; 

Die resultierenden Daten haben genau die gleiche Anzahl von Zeilen wie die Schülertabelle. Die Ergebnismenge enthält keine doppelten Werte für studentid (studentid bleibt erhalten). Obwohl die Kurs-ID in der Kurstabelle eindeutig ist, wird sie in der Ergebnismenge mehrmals wiederholt, da sich möglicherweise viele Schüler für denselben Kurs entschieden haben (mit anderen Worten, die Kurs-ID bleibt nicht erhalten).

Mit diesem Beispiel können Sie zu dem Schluss kommen, dass:

  • Jeder Schlüssel in der Basistabelle fungiert nach dem Join als Schlüssel für die resultierenden Daten (studentid)
  • Die Zeilen aus der Basiszeile erscheinen in den resultierenden Daten höchstens einmal (keine doppelten Zeilen).

Dies ist das Konzept der Key Preserved Tables.

Um zu wissen, ob die Ansichtsspalten aktualisierbar sind,

select * from all_updatable_columns where table_name='V_VIEW_NAME';

PS: Geben Sie den Tabellen-/Ansichtsnamen in GROSSBUCHSTABEN an.

3
Natty