Referentielle Integrität

...komplette Frage anzeigen

2 Antworten

Ich habe z.B. eine Tabelle Mitglieder mit der Mitgl-Nr als Primärschlüssel. Dazu habe ich eine weitere Tabelle mit den Zahlungen (pro Mitglied habe ich ja mehrere Zahlungen, deshalb die eigene Tabelle). In der Tabelle Zahlungen steht auch die Mitgl-Nr, um den Bezug zum Mitglied herzustellen. Nun könnte es sein, dass in der Tabelle Zahlungen Mitgl-Nrn stehen, die es in der Tabelle Mitglieder gar nicht gibt. Z.B. weil das Mitglied gelöscht wurde, die dazugehörenden Zahlungen aber nicht. Um das zu verhindern, bietet die Datenbank eine Möglichkeit unter dem Begriff Referentielle Integrität an, dies zu überwachen. Man definiert in der Tabelle Zahlungen die Mitgl-Nr der Mitgliedertabelle als Fremdschlüssel. Damit sind nur noch Mitgl-Nrn gültig, die in der sog. übergeordneten Tabelle auch vorkommen. Das ist aber noch nicht alles. Es gibt drei Arten von Fremdschlüssel:

  1. delete restict bedeutet, dass das Löschen eines Mitgliedes nur möglich ist, wenn keine Zahlungen vorhanden sind. Ggf. muss man diese vorher löschen.

  2. delete cascade bedeutet, dass im Falle des Löschens die Zahlungen einfach mitgelöscht werden.

  3. delete set null bedeutet, dass die Zahlungen bleiben, aber die ungültig gewordenen Mitgl-Nrn auf null gesetzt werden (geht nicht immer).

Wird eine übergeordnete Tabelle neu erstellt, werden alle Fremdschlüssel-Definitionen entfernt und müssen neu eingerichtet werden.

Anweisungen, die gegen die Integrität verstoßen, werden mit einer Fehlermeldung abgewiesen.

Solche Abhängigkeiten können über mehrere Stufen definiert werden, auch rekursiv, d.h. im Kreis herum. Es gibt dann keine Tabelle, die ganz oben über allen Tabellen steht. Das ist mitunter kompliziert, aber es gibt sinnvolle Anwendungen dafür.

Zu diesem Thema habe ich schon mehrfach Antworten verfasst, suche mal unter wotan38, vielleicht findest die noch irgendwo.

Referentielle Integrität: Kann ich nicht erklären, aber ich kanns 3 mal schnell hintereinander sagen... ;)

xWTFx 23.05.2012, 21:53

Da hast du ja schon viel in deinem Leben erreicht :)

0

Was möchtest Du wissen?