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.
Antworten:
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.
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:
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.
quelle
Die Dokumentation, die Sie bereits gelesen haben, sagt es ziemlich gut. Um es weiter zu erklären:
Normalerweise
update
agiert ein auf einem einzelnen Tisch. Um umständliche Unterabfragen im Filter zu vermeiden, können Sie mit Oracleupdate
eine 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 dieset
Klausel nur Spalten in einer 'key kept'-Tabelle ändert:Beispielsweise:
das erste Update fehlschlägt , weil Oracle keine Möglichkeit von 1: 1 - Abbildung
foo_val
in der Abfragefoo_val
infoo
- umgekehrt das zweite Update erfolgreich , weil Oracle kann 1: 1 abbilden jeweilsbar_val
anbar_val
inbar
. Wichtig ist, dass diesfoo_id
eindeutig ist.foo
Für jede Zeile inbar
kann es also höchstens eine entsprechende Zeile in gebenfoo
( 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).quelle
Lassen Sie mich zuerst ein Beispiel geben und es später erklären. Betrachten Sie 2 Tabellen Students (t_students) und Course (t_course).
Wenn diese beiden Tabellen verknüpft sind ->
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:
Dies ist das Konzept von Key Preserved Tables.
Um zu wissen, ob die Ansichtsspalten aktualisierbar sind,
PS: Geben Sie den Namen der Tabelle / Ansicht in GROSSBUCHSTABEN an.
quelle