(letzte Änderung an dieser Seite: 03.01.2013)
(letzte Synchronisation der PDF-Präsentation: 02.08.2017)
Falls keine PDF-Präsentation zu sehen ist, klicken Sie zum Download hier: Direktdownload PDF-Präsentation
Daten müssen sich in einem logisch korrekten, widerspruchsfreien Zustand befinden. Dann sind die Daten "integer" oder "konsistent".
Beispiel 1: In der folgenden Tabelle sind zwei verschiedene Schreibweisen eines Ortes zu ein und derselben Postleitzahl angegeben; der Arbeitgeber "Bäckerei Zimmermann" ist unterschiedlich erfasst; es fehlt ein Primärschlüssel, d.h. der dritte Datensatz kann nicht eindeutig identiiziert werden.
Beispiel 2: Welche Inkonsistenzen sind in dieser Datenbank zu finden?
Einige Fremdschlüssel weisen ins Nichts: postleitzahl 79312 hat keine Entsprechung in orte, es fehlt eine Tabelle arbeitgeber, auf die die Fremdschlüssel arbeitgeberFK verweisen können.
Damit ein Datenbestand konsistent ist, müssen vier Integritätsbedingungen erfüllt sein:
Interessant für uns ist v.a. die referentielle Integrität, siehe unten. Bereichsintegrität und Entitätsintegrität ist für uns nur theoretisch interessant, da das RDBMS i.d.R. dafür sorgt, dass diese Regeln eingehalten werden (versuchen Sie mal, als Geburtsdatum "hihihi" einzugeben).
Eine Datenbank muss sich VOR einer Transaktion in einem konsistenten Zustand befinden, danach aber ebenfalls. Nun kann es gerade bei Änderungen an zahlreichen Datensätzen vorkommen, dass ein Fehler auftritt - dann sind einige Datensätze von der Änderung betroffen, andere nicht. Die Datenbank ist dann möglicherweise in einem inkonsistenten Zustand. Mit ROLLBACK kann die gesamte Transaktion dann wieder rückgängig gemacht werden (mit COMMIT wird sie bestätigt; das setzt in MySQL/InnoDB voraus, dass AUTOCOMMIT auf 0 steht (MySQL-Doku: AUTOCOMMIT)).
Klassisches Beispiel ist der Bankensektor: Zu einem bestimmten Zeitpunkt werden bspw. die Dispozinsen berechnet und dem Konto zugerechnet. Das betrifft sehr viele Kunden. Wenn nun ein Systemabsturz während der Änderung erfolgt, haben einige Kunden die Dispozinsen bereits zugerechnet, andere nicht. Hier hilft nur ein ROLLBACK.
Die referentielle Integrität besagt, dass Primärschlüssel-Fremdschlüssel-Beziehungen intakt sein müssen. Beispiel:
Die Definition von Wikipedia ist ganz gut, man könnte sie direkt für Klausuren oder das Abitur auswendiglernen:
Definition referentielle Integrität
Die referentielle Integrität (auch Beziehungsintegrität) besagt, dass Attributwerte eines Fremdschlüssels auch als Attributwert des Primärschlüssels vorhanden sein müssen.
Als Grundregel der referentiellen Integrität gilt:
Fremdschlüssel müssen IMMER auf existierende Datensätze verweisen!
Das muss beachtet werden beim
1. Löschen von Datensätzen - wenn dadurch bspw. in der Kindtabelle ein Fremdschlüssel verwaist:
2. Einfügen von Datensätzen - wenn dadurch bspw. in der Kindtabelle ein verwaister Fremdschlüssel entsteht:
Das gilt natürlich auch für das Ändern von Fremdschlüsseln.
Viele RDBMS haben Hilfsmittel, um die referentielle Integrität zu wahren. In MySQL kann InnoDB durch Foreign-Key-Constraints helfen.
Wird ein Datensatz gelöscht, werden die abhängigen Datensätze auch in der Kindtabelle gelöscht. Beispiel: Wird vom Buchhändler ein Autor gelöscht, könnten sämtliche Bücher, die dieser Autor geschrieben hat, ebenfalls gelöscht werden.
Wird ein Datensatz geändert, wird diese Änderung auch in der Kindtabelle ausgeführt. Beispiel:
Da wird über ON DELETE ... oder ON UPDATE ... erledigt. Entweder macht man sich die Hände direkt im MySQL-Code schmutzig und schreibt etwas wie
MySQL-CodeCREATE TABLE kunden ( id INT, name VARCHAR(45),postleitzahl_FK VARCHAR(5), PRIMARY KEY (idkunden), -- .... CONSTRAINT FK_postleitzahl FOREIGN KEY (postleitzahl_FK) REFERENCES orte (postleitzahl) ON DELETE NO ACTION ON UPDATE CASCADE) ENGINE = InnoDB;
... oder man lässt MySQL-Workbench für sich arbeiten. Beim Anlegen oder Ändern einer Tabelle (rechte Maustaste auf die Tabelle, "Alter Table ...") wählt man dann den Tab "Foreign Keys" und stellt die Weitergabeform ein:
Dabei gibt es für ON UPDATE ...
oder ON DELETE ...
folgende möglichen Werte:
CASCADE
- Änderungen/Löschung auch in Kindtabelle vornehmen
SET NULL
- Fremdschlüssel in Kindtabelle auf NULL setzen
NO ACTION
- keine weitere Aktion
RESTRICT
- Aktion verweigern
zdnet: Zuverlässigere Datenbanken durch Fremdschlüssel in MySQL - ausführliche Beschreibung, wie bei MySQL durch Inno-DB die referentielle Integrität aufrechterhalten werden kann.