Was ist das Key Preserved Table-Konzept?

12

Ich habe in der Oracle-Dokumentation über schlüsselkonservierte Tabellen im Abschnitt Join-Ansichten aktualisieren nachgelesen.

Ich fand es jedoch nicht einfach, es zu verstehen.

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

Parmanand
quelle
1
Haben Sie dies auf AskTom gesehen?
Jack sagt, versuchen Sie topanswers.xyz
Hier ist eine weitere Erklärung, die mich dieses knifflige Konzept verständlich gemacht hat: dba.stackexchange.com/questions/38728/…
Vadzim

Antworten:

7

Schlüssel erhalten bedeutet, dass 1 Schlüsselwert an 1 Tabelle geht. Die Angabe von Gegenbeispielen kann Ihnen dabei helfen, dieses Konzept besser zu verstehen.

Beispiel 1:

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 die zu aktualisierenden Zeilen nicht finden.

Beispiel2: Ihrer Ansicht werden Werte aus mehreren Tabellen . In Ihrer Ansicht werden Werte aus den Tabellen PERSON und PERSON_CONTACT_DETAILS (ID, PersonID, ContactType, ContactValue) angezeigt.

Beispielzeilen:

 1,1,email,ddd@example.com
 1,1,phone,898-98-99

Sie nehmen an dieser Tabelle teil und zeigen mehr geschäftsfreundliche Informationen an.

Personen-ID, Name, Nachname, Telefon1, E-Mail1

Hier möchten Sie Phone1 und Email1 aktualisieren. Ihre personID ist jedoch zwei verschiedenen Zeilen zugeordnet. In diesem Beispiel sind möglicherweise mehrere Zeilen vorhanden. In dieser Ansicht kann die Datenbank die zu aktualisierenden Zeilen nicht finden.

Hinweis: Wenn Sie Ihre Ansicht sql einschränken und klarstellen, 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 auf 1 Tabelle abbilden. Zum Beispiel haben Sie eins zu eins PERSON, PERSON_DETAILS Tabellen. Hier wird das Anzeigen und Aktualisieren funktionieren, da es eins zu eins ist.

Atilla Ozgur
quelle
Was ist, wenn die zu aktualisierende Tabelle einen zusammengesetzten Primärschlüssel enthält?
Johny, warum
7

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

Das Konzept einer schlüsselkonservierten Tabelle ist von grundlegender Bedeutung für das Verständnis der Einschränkungen beim Ändern von Join-Ansichten.

Normalerweise updateagiert ein auf einem einzelnen Tisch. Um umständliche Unterabfragen im Filter zu vermeiden, können Sie mit Oracle updateeine Ansicht (oder Unterabfrage) erstellen, solange Sie die vorgenommenen Änderungen problemlos auf die zugrunde liegenden realen Zeilen in einer Tabelle abbilden können. Dies ist möglich, wenn die setKlausel nur Spalten in einer 'key kept'-Tabelle ändert:

Eine Tabelle bleibt schlüsselbewahrt, wenn jeder Schlüssel der Tabelle auch ein Schlüssel des Join-Ergebnisses sein kann. Bei einer schlüsselkonservierten Tabelle werden die Schlüssel also über einen Join beibehalten.

Beispielsweise:

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 fehlschlägt , weil Oracle keine Möglichkeit von 1: 1 - Abbildung foo_valin der Abfrage foo_valin foo- umgekehrt das zweite Update erfolgreich , weil Oracle kann 1: 1 abbilden jeweils bar_valan bar_valin bar. Wichtig ist, dass dies foo_ideindeutig ist. fooFür jede Zeile in barkann es also höchstens eine entsprechende Zeile in geben foo( in diesem Beispiel sogar genau 1). Dasselbe gilt für einen nullbaren Fremdschlüssel. Der Punkt ist, dass es nie gibt mehr als eine Reihe).

Jack sagt, versuchen Sie es mit topanswers.xyz
quelle
3

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

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

Wenn diese beiden Tabellen verknüpft 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 Teilnehmer für denselben Kurs entschieden haben (mit anderen Worten, die Kurs-ID wird nicht beibehalten).

Mit diesem Beispiel können Sie zu folgendem Schluss kommen:

  • 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 von 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 Namen der Tabelle / Ansicht in GROSSBUCHSTABEN an.

Natty
quelle