Wie zu pflegen Referentielle Integrität in einer Multitable SQL-Datenbank
Auch wenn jede Tabelle in der SQL-Systemeinheit Integrität und Domain-Integrität hat, können Sie immer noch ein Problem haben wegen Unstimmigkeiten in der Art und Weise einem Tisch zum anderen bezieht. In den meisten gut gestalteten Mehrtabellen Datenbanken enthält jede Tabelle mindestens eine Spalte, die in einer anderen Tabelle in der Datenbank auf eine Spalte bezieht.
Menu
Diese Referenzen sind wichtig für die Gesamtintegrität der Datenbank aufrechterhalten wird. Die gleichen Bezugszeichen, jedoch machen Update Anomalien möglich. Update-Anomalien sind Probleme, die nach der Aktualisierung der Daten in einer Zeile einer Datenbanktabelle auftreten können.
Ärger zwischen Eltern und Kind Tabellen
Die Beziehungen zwischen den Tabellen sind im allgemeinen nicht bidirektional. Eine Tabelle ist in der Regel abhängig von der anderen Seite. Sagen Sie, dass Sie eine Datenbank mit einem Client-Tabelle und eine Tabelle ORDERS haben. Sie können einen Client in die Client-Tabelle eingeben, bevor sie Aufträge macht. Sie können jedoch nicht eine Bestellung in die ORDERS-Tabelle eintragen, wenn Sie bereits einen Eintrag in der Tabelle Kunde für den Kunden haben, der diese Ordnung bewegt.
Die Tabelle ORDERS ist auf dem Client-Tabelle abhängig. Diese Art der Anordnung wird oft als ein Eltern-Kind-Beziehung, wo CLIENT ist die übergeordnete Tabelle und ORDERS ist das Kind Tabelle. Das Kind ist auf dem übergeordneten abhängig.
Im allgemeinen ist die Primärschlüssel der übergeordneten Tabelle eine Spalte (oder Gruppe von Spalten), die in der untergeordneten Tabelle erscheint. Innerhalb der untergeordneten Tabelle, die gleiche Spalte (oder Gruppe) ist ein Fremdschlüssel. Beachten Sie jedoch, dass ein Fremdschlüssel nicht eindeutig sein muss.
Update-Anomalien entstehen auf verschiedene Weise zwischen Eltern und Kind-Tabellen. Ein Client weg bewegt, zum Beispiel, und Sie wollen, dass sie Informationen aus der Datenbank zu löschen. Wenn sie einige Aufträge bereits gemacht hat (die Sie in der Tabelle ORDERS aufgezeichnet), konnte sie von der Client-Tabelle zu löschen ein Problem darstellen.
Sie müssten Datensätze in der ORDERS (Kind) Tabelle, für die Sie keine entsprechenden Einträge in der CLIENT (Eltern) Tisch. Ähnliche Probleme können auftreten, wenn Sie ohne einen entsprechenden Zusatz zu der übergeordneten Tabelle einen Datensatz zu einer untergeordneten Tabelle hinzuzufügen.
Die entsprechenden Fremdschlüssel in allen untergeordneten Tabellen müssen alle Änderungen beziehen sich auf die Primärschlüssel einer Zeile in einem übergeordneten Tabellen- sonst ein Update Anomalie Ergebnisse.
Verwenden Sie kaskadierende Löschungen mit Sorgfalt
Sie können die meisten der referentiellen Integrität Probleme zu beseitigen, indem Sie den Update-Prozess sorgfältig zu steuern. In einigen Fällen müssen Sie Kaskade Deletionen von einer übergeordneten Tabelle auf seine Kinder. Um eine Löschung kaskadieren, wenn Sie eine Zeile aus einer übergeordneten Tabelle zu löschen, löschen Sie auch alle Zeilen in der untergeordneten Tabellen, deren Fremdschlüssel entsprechen den Primärschlüssel der gelöschten Zeile in der übergeordneten Tabelle.
Werfen Sie einen Blick auf das folgende Beispiel:
CREATE TABLE-Client (Client CHAR (30) PRIMARY KEY, Address1 CHAR (30), Address2 CHAR (30), CityCHAR (25) NOT NULL, StateCHAR (2), Postal CHAR (10), PhoneCHAR (13), Fax CHAR ( 13), Contact CHAR (30)) -create TABLE-Tests (Testname CHAR (30) PRIMARY KEY, StandardCharge CHAR (30)) -create TABLE EMPLOYEE (EmployeeName CHAR (30) PRIMARY KEY, ADRESSE1 CHAR (30), Address2 CHAR ( 30), CityCHAR (25), StateCHAR (2), Postal CHAR (10), Homephone CHAR (13), OfficeExtension CHAR (4), HireDate DATE, JobClassification CHAR (10), HourSalComm CHAR (1)) -create TABLE ORDERS (Auftragsnummer INTEGER PRIMARY KEY, Client CHAR (30), TestOrdered CHAR (30), Verkäufer CHAR (30), Orderdate DATE, CONSTRAINT NameFK FOREIGN KEY (Clientname) LITERATUR CLIENT (Client) ON DELETE CASCADE, CONSTRAINT TestFK FOREIGN KEY (TestOrdered) LITERATUR Tests (Testname) ON DELETE CASCADE, CONSTRAINT SalesFK FOREIGN KEY (Verkäufer) REFERENCES Mitarbeiter (EmployeeName) ON DELETE CASCADE) -
Die Einschränkung NameFK Namen Kundenname als Fremdschlüssel, dass die Verweise Kundenname Spalte in der Tabelle Kunde. Wenn Sie eine Zeile in der Client-Tabelle zu löschen, auch löschen Sie automatisch alle Zeilen in der Tabelle ORDERS, die denselben Wert in der haben Kundenname Spalte wie jene in der Kundenname Spalte der Tabelle Kunde.
Die Lösch Kaskaden von der Client-Tabelle in die Tabelle ORDERS. Das gleiche gilt für die Fremdschlüssel in der Tabelle ORDERS, die den Primärschlüssel der Tests und EMPLOYEE Tabellen beziehen.
Alternative Wege zur Aktualisierung Anomalien steuern
Sie können nicht eine Löschung zu kaskadieren möchten. Stattdessen können Sie die untergeordnete Tabelle Fremdschlüssel zu einem ändern NULL Wert. Betrachten Sie die folgende Variante:
CREATE TABLE ORDERS (Auftragsnummer INTEGER PRIMARY KEY, Client CHAR (30), TestOrdered CHAR (30), Salesperson CHAR (30), Orderdate DATE, CONSTRAINT NameFK FOREIGN KEY (Clientname) LITERATUR CLIENT (Clientname), CONSTRAINT TestFK FOREIGN KEY (TestOrdered) LITERATUR Tests (Testname), CONSTRAINT SalesFK FOREIGN KEY (Verkäufer) REFERENCES Mitarbeiter (EmployeeName) ON DELETE SET NULL) -
Die Einschränkung SalesFK Namen der Verkäufer Spalte als Fremdschlüssel, die referenziert Mitarbeitername Spalte der Tabelle EMPLOYEE. Wenn ein Verkäufer das Unternehmen verlässt, Sie ihre Zeile in der Tabelle EMPLOYEE löschen. Neue Verkäufer werden schließlich zu ihren Konten zugewiesen, aber für jetzt, verursacht alle ihre Aufträge in der Auftragstabelle ihren Namen aus der Tabelle employee löschen einen Nullwert in der zu empfangen Verkäufer Spalte.
Sie können auch inkonsistente Daten aus einer Datenbank zu halten, indem eine dieser Methoden verwenden:
Refuse eine Ergänzung zu einer untergeordneten Tabelle zu ermöglichen, bis eine entsprechende Zeile in der übergeordneten Tabelle vorhanden ist. Wenn Sie sich weigern, Zeilen in einer untergeordneten Tabelle in einer übergeordneten Tabelle ohne eine entsprechende Zeile zu ermöglichen, verhindern Sie das Auftreten von # 147-Waise # 148- Zeilen in der untergeordneten Tabelle. Diese Ablehnung hilft Konsistenz zwischen Tabellen pflegen.
Refuse Änderungen zu ermöglichen, einen Primärschlüssel der Tabelle. Wenn Sie sich weigern, Änderungen an einer Tabelle Primärschlüssel zu ermöglichen, müssen Sie nicht über das Aktualisieren Fremdschlüssel in anderen Tabellen zu sorgen, die auf dem Primärschlüssel abhängen.