6. Datenintegrität Motivation § Semantische Integrität (auch: Konsistenz) der in einer Datenbank gespeicherten Daten als wichtige Anforderung § nur sinnvolle Attributwerte (z.B. keine negativen Semester) § Abhängigkeiten zwischen Attributwerten (z.B. Telefon oder E-Mail muss bekannt sein) § Referentielle Integrität d.h. Integrität von Verweisen (z.B. Professor zu einer Vorlesung muss bekannt sein) § Eindeutigkeit von Attributwerten (z.B. jedes Büro darf nur einmal in Professoren auftauchen) § nur sinnvolle Änderungen der Attributwerte (z.B. Semester darf nicht verringert werden) Datenbanken / Kapitel 6: Datenintegrität 2 Inhalt § 6.1 Semantische Integrität § 6.2 Primärschlüssel und Eindeutigkeit § 6.3 Referentielle Integrität § 6.4 Constraints § 6.5 Trigger Datenbanken / Kapitel 6: Datenintegrität 3 6.1 Semantische Integrität § Semantische Integrität der Daten umfasst Anforderungen an den Zustand und Zustandsänderungen der Daten § Integritätsbedingungen müssen während des Datenbankentwurfs für den relevanten Ausschnitt der realen Welt erfasst werden § Integritätsbedingungen müssen allgemein und nicht nur auf den aktuellen Daten gelten Datenbanken / Kapitel 6: Datenintegrität 4 Statische Integritätsbedingungen § Statische Integritätsbedingungen sind Anforderungen an den Zustand der Daten § Beispiele: § hören verweist nur auf bekannte Studenten und Vorlesungen § Semester eines Studenten muss eine positive Zahl sein § Büro eines Professors darf nicht NULL sein § Professoren haben Einzelbüros Datenbanken / Kapitel 6: Datenintegrität 5 Dynamische Integritätsbedingungen § Dynamische Integritätsbedingungen sind Anforderungen an die Zustandsveränderung der Daten § Beispiele: § Semester eines Studenten darf nur erhöht werden § MatrNr eines Studenten darf nie verändert werden § Fach eines Professors darf nur vom initialen Wert NULL zu einem anderen von NULL verschiedenen Wert werden Datenbanken / Kapitel 6: Datenintegrität 6 Semantische Integrität in RDBMSs § RDBMSs sichern die semantische Integrität der Daten, sofern sinnvolle Integritätsbedingungen definiert sind § Sicherstellung der semantischen Integrität im Code der Anwendung hat im Vergleich schlechtere Wartbarkeit und höhere Fehleranfälligkeit § SQL unterstützt Definition von Integritätsbedingungen seit SQL-89 (z.B. Primär- und Fremdschlüssel) bzw. SQL:1999 (z.B. Trigger) Datenbanken / Kapitel 6: Datenintegrität 7 6.2 Primärschlüssel und Eindeutigkeit § Zur Erinnerung: Eine Menge von Attributen ist ein Schlüsselkandidat, wenn Sie die Tupel (Zeilen) einer Relation (Tabelle) eindeutig identifiziert § Beispiel: Tabelle Professoren in Hochschulanwendung § PersNr als künstliches Attribut ist Schlüsselkandidat § Büro ist Schlüsselkandidat (sofern Einzelbüros) § Wie können wir sicherstellen, dass es je Wert der beiden Attribute nur einen Professor gibt? Datenbanken / Kapitel 6: Datenintegrität 8 Primärschlüssel § Einer der Schlüsselkandidaten wird als Primärschlüssel ausgewählt und kann als solcher markiert werden § Beispiel: Tabelle Professoren 1 2 3 4 5 6 7 8 CREATE TABLE Professoren ( PersNr int NOT NULL , Vorname varchar (30) NOT NULL , Name varchar (30) NOT NULL , B ü ro int NOT NULL , Fach varchar (60) NULL , PRIMARY KEY ( PersNr ) ) § Wie können wir sicherstellen, dass es nur einen Professor pro Büro gibt? Datenbanken / Kapitel 6: Datenintegrität 9 Eindeutigkeit § Eindeutige Attribute können durch Angabe von UNIQUE im CREATE TABLE Kommando angegeben werden § Beispiel: Tabelle Professoren 1 2 3 4 5 6 7 8 CREATE TABLE Professoren ( PersNr int NOT NULL , Vorname varchar (30) NOT NULL , Name varchar (30) NOT NULL , B ü ro int NOT NULL UNIQUE , Fach varchar (60) NULL , PRIMARY KEY ( PersNr ) ) Datenbanken / Kapitel 6: Datenintegrität 10 6.3 Referentielle Integrität § Fremdschlüssel stellen eine Integritätsbedingung dar (d.h. referenzierte Tupel müssen vorhanden sein) § RDBMS stellt referentielle Integrität der Daten sicher, d.h. wenn die Attribute A1 ,…, An als Fremdschlüssel auf eine andere Tabelle T markiert sind, dann § müssen alle Ai den Wert NULL haben (sofern erlaubt), oder § es muss ein entsprechendes Tupel mit den Werten der Attribute Ai als Primärschlüssel in der Tabelle T existieren Datenbanken / Kapitel 6: Datenintegrität 11 Fremdschlüssel § Fremdschlüssel werden mittels FOREIGN KEY ... REFERENCES angegeben und können jeweils mehrere Attribute enthalten § Beispiel: Tabelle Vorlesungen 1 2 3 4 5 6 7 8 9 CREATE TABLE Vorlesungen ( VorlNr int NOT NULL , Bezeichnung varchar (60) NOT NULL , SWS varchar (30) NOT NULL , PersNr int NULL , FOREIGN KEY ( PersNr ) REFERENCES Professoren ( PersNr ) , PRIMARY KEY ( VorlNr ) ) § Wie soll sich RDBMS bei Änderung der Daten verhalten? Datenbanken / Kapitel 6: Datenintegrität 12 Fremdschlüssel bei Änderung der Daten § Ohne weitere Angabe, verweigert RDBMS Löschen eines Tupels, sofern noch ein anderes Tupel per Fremdschlüssel darauf verweist § Bei Definition eines Fremdschlüssels können wir angeben, was bei Änderung referenzierter Daten geschehen soll § SQL erweitert FOREIGN KEY Kommando wie folgt § Angabe eines Ereignis: ON DELETE oder ON UPDATE § Angabe des Verhaltens: CASCADE oder SET NULL Datenbanken / Kapitel 6: Datenintegrität 13 Fremdschlüssel bei Änderung der Daten § Beispiel: Vorlesungen mit Fremdschlüssel auf Professoren 1 2 3 4 5 6 7 8 9 10 CREATE TABLE Vorlesungen ( VorlNr int NOT NULL , Bezeichnung varchar (60) NOT NULL , SWS varchar (30) NOT NULL , PersNr int NULL , FOREIGN KEY ( PersNr ) REFERENCES Professoren ( PersNr ) ON UPDATE CASCADE , PRIMARY KEY ( VorlNr ) ) § Ändert sich die PersNr eines Professors, wird die geänderte PersNr für seine Vorlesungen übernommen Datenbanken / Kapitel 6: Datenintegrität 14 Fremdschlüssel bei Änderung der Daten § Beispiel: Vorlesungen mit Fremdschlüssel auf Professoren 1 2 3 4 5 6 7 8 9 10 CREATE TABLE Vorlesungen ( VorlNr int NOT NULL , Bezeichnung varchar (60) NOT NULL , SWS varchar (30) NOT NULL , PersNr int NULL , FOREIGN KEY ( PersNr ) REFERENCES Professoren ( PersNr ) ON DELETE CASCADE , PRIMARY KEY ( VorlNr ) ) § Wird ein Professor gelöscht, so werden alle seine Vorlesungen gelöscht Datenbanken / Kapitel 6: Datenintegrität 15 Fremdschlüssel bei Änderung der Daten § Beispiel: Vorlesungen mit Fremdschlüssel auf Professoren 1 2 3 4 5 6 7 8 9 10 CREATE TABLE Vorlesungen ( VorlNr int NOT NULL , Bezeichnung varchar (60) NOT NULL , SWS varchar (30) NOT NULL , PersNr int NULL , FOREIGN KEY ( PersNr ) REFERENCES Professoren ( PersNr ) ON UPDATE SET NULL , PRIMARY KEY ( VorlNr ) ) § Ändert sich die PersNr eines Professors, wird die PersNr seiner Vorlesungen auf NULL gesetzt Datenbanken / Kapitel 6: Datenintegrität 16 Fremdschlüssel bei Änderung der Daten § Beispiel: Vorlesungen mit Fremdschlüssel auf Professoren 1 2 3 4 5 6 7 8 9 10 CREATE TABLE Vorlesungen ( VorlNr int NOT NULL , Bezeichnung varchar (60) NOT NULL , SWS varchar (30) NOT NULL , PersNr int NULL , FOREIGN KEY ( PersNr ) REFERENCES Professoren ( PersNr ) ON DELETE SET NULL , PRIMARY KEY ( VorlNr ) ) § Wird ein Professor gelöscht, so wird die PersNr seiner Vorlesungen auf NULL gesetzt Datenbanken / Kapitel 6: Datenintegrität 17 6.4 Constraints § Integritätsbedingungen (constraints) lassen sich mittels des CONSTRAINT Kommandos in SQL definieren § Integritätsbedingungen haben einen Namen und SQL erlaubt deren Definition in den Kommandos CREATE TABLE und ALTER TABLE § Integritätsbedingungen beziehen sich immer auf eine einzelne Tabelle Datenbanken / Kapitel 6: Datenintegrität 18 UNIQUE Constraints § Eindeutigkeit einzelner Attribute lässt sich bei der Definition einer Tabelle mittels UNIQUE erreichen § UNIQUE Constraints erlauben darüber hinaus, die Eindeutigkeit einer Mengen von Attributen festzulegen § NULL-Werte sind, anders als bei Primärschlüsseln, erlaubt Datenbanken / Kapitel 6: Datenintegrität 19 UNIQUE Constraints § Beispiel: Tabelle Vorlesungen erweitert um ein Attribut Studiengang; im gleichen Studiengang darf es nicht mehrere Vorlesungen mit gleichen Namen geben 1 2 3 4 5 6 7 8 9 10 CREATE TABLE Vorlesungen ( VorlNr int NOT NULL , Bezeichnung varchar (60) NOT NULL , Studiengang varchar (30) NULL , SWS varchar (30) NOT NULL , PersNr int NULL , CONSTRAINT B e z e i c h n u n g S t u d i e n g a n g U n i q u e UNIQUE ( Bezeichnung , Studiengang ) , PRIMARY KEY ( VorlNr ) ) Eine Vorlesung mit Titel „Wissenschaftliches Arbeiten“, die keinem Studiengang zugeordnet ist, ist möglich Datenbanken / Kapitel 6: Datenintegrität 20 CHECK Constraints § Integritätsbedingungen, die sich auf die Werte der Attribute eines Tupels (Zeile) beziehen, lassen sich mittels des CHECK Kommandos definieren § CHECK Constraints können z.B. verwendet werden, um § Wertebereich eines Attributs einzugrenzen § Zusammenhänge zwischen Attributwerten zu erfassen (z.B. nur bestimmte Kombinationen zu erlauben) § … Datenbanken / Kapitel 6: Datenintegrität 21 CHECK Constraints § Beispiel: Einschränkung des Wertebereichs von Semester auf einen Wert im Bereich [1,50] 1 2 3 4 5 6 7 8 9 CREATE TABLE Studenten ( MatrNr int NOT NULL , Vorname varchar (30) NOT NULL , Name varchar (30) NOT NULL , Semester int NOT NULL , CONSTRAINT Semester Cons traint CHECK ( Semester >= 1 AND Semester <= 50) , PRIMARY KEY ( MatrNr ) ) § RDBMSs erlauben teilweise auch die Angabe ohne Benennung bei der Deklaration des Attributes 1 Semester int NOT NULL CHECK ( Semester >= 1 AND Semester <= 50) , Datenbanken / Kapitel 6: Datenintegrität 22 CHECK Constraints § Beispiel: Tabelle Professoren erweitert um private Kontaktdaten E-Mail und Mobil, wovon mindestens eines bekannt sein müssen 1 2 3 4 5 6 7 8 9 10 11 12 CREATE TABLE Professoren ( PersNr int NOT NULL , Vorname varchar (30) NOT NULL , Name varchar (30) NOT NULL , B ü ro int NOT NULL UNIQUE , Fach varchar (60) NULL , EMail varchar (60) NULL , Mobil varchar (60) NULL , CONSTRAINT Erreichbarkeit CHECK ( EMail IS NOT NULL OR Mobil IS NOT NULL ) , PRIMARY KEY ( PersNr ) ) Datenbanken / Kapitel 6: Datenintegrität 23 CHECK Constraints § Beispiel: Attribut Mobil in Tabelle Professoren soll nur Werte der Form +49 (177) 7343809 erlauben 1 2 3 4 5 6 7 8 9 10 11 12 Datenbanken / Kapitel 6: Datenintegrität CREATE TABLE Professoren ( PersNr int NOT NULL , Vorname varchar (30) NOT NULL , Name varchar (30) NOT NULL , B ü ro int NOT NULL UNIQUE , Fach varchar (60) NULL , EMail varchar (60) NULL , Mobil varchar (60) NULL , CONSTRAINT MobilFormat CHECK ( Mobil LIKE ’ +% (%) % ’) , PRIMARY KEY ( PersNr ) ) 24 CHECK Constraints § Beispiel: Attribut Fach in Tabelle Professoren darf nur die Werte „Informatik“, „Mathematik“ und „Physik“ annehmen 1 2 3 4 5 6 7 8 9 10 11 12 CREATE TABLE Professoren ( PersNr int NOT NULL , Vorname varchar (30) NOT NULL , Name varchar (30) NOT NULL , B ü ro int NOT NULL UNIQUE , Fach varchar (60) NULL , EMail varchar (60) NULL , Mobil varchar (60) NULL , CONSTRAINT F ä cher CHECK ( Fach IN ( ’ Informatik ’ , ’ Mathematik ’ , ’ Physik ’)) , PRIMARY KEY ( PersNr ) ) Datenbanken / Kapitel 6: Datenintegrität 25 CHECK Constraints § CHECK Constraints können Unteranfragen enthalten und so komplexe Integritätsbedingungen abbilden § RDBMS muss komplexe Integritätsbedingungen bei jeder Änderung der Daten überprüfen und enthaltene Unteranfragen auswerten (Kosten!) Datenbanken / Kapitel 6: Datenintegrität 26 CHECK Constraints § Beispiel: Studenten müssen Vorlesungen gehört haben, in denen sie eine Prüfung ablegen 1 2 3 4 5 6 7 8 9 10 11 CREATE TABLE pr ü fen ( MatrNr int NOT NULL , VorlNr int NOT NULL , Note float NOT NULL , CONSTRAINT VorlesungGeh ö rt CHECK ( EXISTS ( SELECT * FROM h ö ren WHERE h ö ren . MatrNr = pr ü fen . MatrNr AND h ö ren . VorlNr = pr ü fen . VorlNr )) , PRIMARY KEY ( MatrNr , VorlNr ) ) § Bemerkung: Dies ließe sich auch durch einen Fremdschlüssel in prüfen umsetzen Datenbanken / Kapitel 6: Datenintegrität 27 CHECK Constraints § Beispiel: Studenten dürfen nicht mehrere Vorlesungen mit identischem Titel hören 1 2 3 4 5 6 7 8 9 10 11 12 13 14 CREATE TABLE h ö ren ( MatrNr int NOT NULL , VorlNr int NOT NULL , CONSTRAINT T i t e l U n t e r s c h i e d l i c h CHECK ( NOT EXISTS ( SELECT * FROM h ö ren h , Vorlesung v1 , Vorlesung v2 WHERE h . MatrNr = h ö ren . MatrNr AND h . VorlNr = v1 . VorlNr AND h ö ren . VorlNr = v2 . VorlNr AND v1 . Titel = v2 . Titel ) PRIMARY KEY ( MatrNr , VorlNr ) ) Datenbanken / Kapitel 6: Datenintegrität 28 6.5 Trigger § Trigger wurden in SQL:1999 eingeführt und sind der allgemeinste Mechanismus, um Integritätsbedingungen zu formulieren § Trigger beschreiben eine Aktion, die beim Eintreten eines bestimmten Ereignis durchgeführt werden soll § Aktion wird in prozeduraler Programmiersprache des RDBMS geschrieben (z.B. Transact-SQL oder PL/SQL) § Syntax ist (noch) wenig einheitlich zwischen RDBMSs Datenbanken / Kapitel 6: Datenintegrität 29 Trigger § Trigger können verwendet werden, um dynamische Integritätsbedingungen zu formulieren § Beispiel: Semester von Studenten darf nur erhöht werden 1 2 3 4 5 6 CREATE TRIGGER SemesterErh ö hung BEFORE UPDATE OF Semester ON Studenten FOR EACH ROW WHEN ( old . Semester > new . Semester ) SET ( new . Semester = old . Semester ) END Betrifft eine Änderung das Semester Attribut (Ereignis), wird überprüft, ob der neue Wert kleiner ist und ggf. der alte Wert beibehalten (Aktion) Datenbanken / Kapitel 6: Datenintegrität 30 Übung Integritätsbedingungen Versandhandel § Beispiel: Artikel und Bestellungen im Versandhandel 1 2 3 4 5 6 7 8 9 CREATE TABLE Bestellungen ( BestellNr int NOT NULL , KundenNr int NOT NULL , Bestelldatum date NOT NULL , Lieferdatum date NULL , Betrag money NOT NULL , Bemerkung varchar (100) NULL , PRIMARY KEY ( BestellNr ) ) 1 2 3 4 5 6 7 8 9 10 11 12 CREATE TABLE Kunden ( KundenNr int NOT NULL , Name varchar (40) NOT NULL , Vorname varchar (30) NOT NULL , Strasse varchar (40) NOT NULL , PLZ char (5) NOT NULL , Wohnort varchar (40) NOT NULL , Telefon varchar (20) NULL , Telefax varchar (20) NULL , Email varchar (30) NULL , PRIMARY KEY ( KundenNr ) ) § Was sind sinnvolle Fremdschlüssel? § PLZ von Kunden soll zwischen „01067“ und „99189“ liegen § Kunden sollen auf mindestens zwei der Kommunikationswege Telefon, Telefax und E-Mail erreichbar sein § Bestellungen werden frühestens am Bestelldatum ausgeliefert Datenbanken / Kapitel 6: Datenintegrität 31 Übung Integritätsbedingungen Versandhandel 1 2 3 4 5 6 7 8 9 10 11 12 13 CREATE TABLE Bestellungen ( BestellNr int NOT NULL , KundenNr int NOT NULL , Bestelldatum date NOT NULL , Lieferdatum date NULL , Betrag money NOT NULL , Bemerkung varchar (100) NULL , CONSTRAINT Daten CHECK ( Bestelldatum <= Lieferdatum ) , FOREIGN KEY KundenNr REFERENCES Kunden ( KundenNr ) , PRIMARY KEY ( BestellNr ) ) Datenbanken / Kapitel 6: Datenintegrität 32 Übung Integritätsbedingungen Versandhandel 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 CREATE TABLE Kunden ( KundenNr int NOT NULL , Name varchar (40) NOT NULL , Vorname varchar (30) NOT NULL , Strasse varchar (40) NOT NULL , PLZ char (5) NOT NULL , Wohnort varchar (40) NOT NULL , Telefon varchar (20) NULL , Telefax varchar (20) NULL , Email varchar (30) NULL , CONSTRAINT Postleitzahlen CHECK ( PLZ >= ’ 01067 ’ AND PLZ <= ’ 99189 ’) , CONSTRAINT Erreichbarkeit CHECK (( Telefon IS NOT NULL AND Telefax IS NOT NULL ) OR ( Telefon IS NOT NULL AND Email IS NOT NULL ) OR ( Telefax IS NOT NULL AND Email IS NOT NULL )) , PRIMARY KEY ( KundenNr ) ) Datenbanken / Kapitel 6: Datenintegrität 33 Zusammenfassung § Semantische Integrität umfasst Anforderungen an Zustand und Zustandsänderungen der Daten § Statische Integritätsbedingungen umsetzbar mittels § Primärschlüsseln und Fremdschlüsseln § Constraints z.B. zur Wahrung der Eindeutigkeit oder Einschränkung des Wertebereichs § Dynamische Integritätsbedingungen umsetzbar mittels § Trigger als allgemeiner Mechanismus mit systemabhängiger Syntax Datenbanken / Kapitel 6: Datenintegrität 34 Literatur [1] A. Kemper und A. Eickler: Datenbanksysteme – Eine Einführung, De Gruyter Oldenbourg, 2015 (Kapitel 5) [2] G. Saake, K.-U. Sattler und A. Heuer: Datenbanken - Konzepte und Sprachen, mitp Professional, 2013 (Kapitel 12) Datenbanken / Kapitel 6: Datenintegrität 35