- 1 Section
- 10 Lessons
- unbegrenzt
- Datenintegrität & Transaktionen10
- 1.1Integritätstypen
- 1.2Primary Key, Foreign Key, Constraints
- 1.3Referenzielle Integrität: ON DELETE, ON UPDATE
- 1.4Was sind Transaktionen?
- 1.5ACID-Eigenschaften
- 1.6Transaktions-Isolation und Anomalien
- 1.7COMMIT, ROLLBACK und SAVEPOINT
- 1.8Deadlocks: Entstehung und Vermeidung
- 1.9Datenbankindizes und Performance
- 1.10Aufgaben Datenintegrität
Integritätstypen
Stell dir einen Aktenschrank im Büro vor in den jeder Mitarbeiter reinwerfen darf was er will – ohne Beschriftung, doppelte Akten, halb ausgefüllte Formulare, Verweise auf Akten die längst geschreddert wurden. Nach drei Monaten ist das Chaos perfekt: man findet nichts, niemand vertraut den Daten und jede Auswertung produziert Unsinn. Genau dieses Chaos verhindert eine Datenbank, wenn sie richtig konfiguriert ist.
Das Schlagwort dafür heißt Datenintegrität: die Eigenschaft, dass alle Daten in einer Datenbank korrekt, vollständig, eindeutig und in sich widerspruchsfrei sind – und auch bleiben, egal wer was wann einfügt oder ändert. Das Schöne: das DBMS (Database Management System) übernimmt das Wachen automatisch. Du definierst beim Anlegen einer Tabelle die Regeln (sogenannte Constraints), und ab dann lehnt die Datenbank jeden Einfüge- oder Änderungsversuch ab, der die Regeln bricht. Diese Lektion zeigt dir welche Regeln das sind – die vier klassischen Integritätstypen.
1) Was Datenintegrität konkret bedeutet
Datenintegrität ist kein einzelnes Feature, sondern eine Zusicherung mit mehreren Dimensionen. Eine Datenbank gilt als integer wenn vier Bedingungen gleichzeitig gelten:
- Eindeutigkeit – jede Entität (jeder Kunde, jede Bestellung, jeder Artikel) ist genau einmal vorhanden und unterscheidbar.
- Konsistenz von Beziehungen – wenn eine Entität auf eine andere verweist, existiert das Ziel auch wirklich. Keine „Leerverweise".
- Wertkorrektheit – ein Geburtsdatum ist ein Datum, ein Preis ist eine Zahl, ein Geschlecht hat nur erlaubte Ausprägungen.
- Fachliche Plausibilität – Werte ergeben auch im Kontext deines Geschäfts Sinn (negative Lagerbestände z.B. sind technisch eine Zahl, fachlich aber Unfug).
Genau diesen vier Dimensionen entsprechen die vier Integritätstypen die wir gleich durchgehen. Vor jeder schreibenden Operation prüft das DBMS automatisch: passen die neuen Daten zu allen definierten Constraints? Wenn nein, wird der Vorgang abgewiesen – mit einer Fehlermeldung, nicht mit stillem Wegspeichern. Das ist auch der Grund warum diese Regeln im Datenbankschema stehen sollten und nicht (nur) in deinem Anwendungscode: das DBMS ist die letzte Verteidigungslinie, egal welcher Client schreibt.
2) Die vier Integritätstypen im Überblick
Die vier Typen unterscheiden sich darin was sie schützen. Klick eine Karte um Definition, Regel und ein Beispiel zu sehen:
INTEGER ist. Der vierte Typ – die fachlichen Geschäftsregeln – kennt die Datenbank nicht von Haus aus. Sie muss dir diese Regeln explizit erklären: über CHECK-Bedingungen, Trigger oder Stored Procedures.3) Entitätsintegrität – jede Zeile muss eindeutig sein
„Entität" ist Datenbank-Sprech für „ein Ding" – ein Kunde, eine Bestellung, ein Produkt. Die Entitätsintegrität verlangt: jedes Ding in deiner Tabelle muss eindeutig identifizierbar sein. Sonst weißt du nie ob du Kunde Müller bearbeitest oder versehentlich seinen Doppelgänger. Umgesetzt wird das mit dem Primärschlüssel (Primary Key), den wir in Lektion 2 noch im Detail anschauen.
Ein Primärschlüssel ist eine Spalte (oder Kombination mehrerer Spalten) die in jeder Zeile garantiert vorhanden ist (also NOT NULL) und einmalig (UNIQUE). Diese zwei Bedingungen sind die Entitätsintegrität. Was passiert wenn man dagegen verstößt:
kunden · ■ Primärschlüssel| kunden_id | name | |
|---|---|---|
| 1 | Anna Bauer | anna@beispiel.de |
| 2 | Tim Schulz | tim@beispiel.de |
| 3 | Lisa Wagner | lisa@beispiel.de |
| 2 | Doppelter Tim | tim2@beispiel.de |
| NULL | Niemand | ? |
2 – das DBMS würde mit ERROR 1062: Duplicate entry '2' for key 'PRIMARY' ablehnen. Die fünfte Zeile lässt den Schlüssel ganz leer (NULL) – auch das ist verboten, weil dann keine eindeutige Identifikation mehr möglich ist. Genau deshalb ist ein Primary Key automatisch NOT NULL + UNIQUE in einem.4) Referenzielle Integrität – Beziehungen müssen halten
Selten steht eine Tabelle für sich allein. Bestellungen gehören zu Kunden, Bestellpositionen zu Bestellungen, Kommentare zu Beiträgen. Solche Beziehungen modelliert man mit Fremdschlüsseln (Foreign Keys): eine Spalte in Tabelle A verweist auf den Primärschlüssel in Tabelle B (siehe auch Kardinalitäten in K34).
Die referenzielle Integrität garantiert: ein Fremdschlüssel zeigt nie auf eine nicht-existierende Zeile. Wenn eine Bestellung „Kunde 42" referenziert, muss Kunde 42 auch wirklich existieren. Andernfalls hättest du eine verwaiste Zeile (orphan row): eine Bestellung ohne Besitzer. Hier siehst du den Unterschied:
| id | kunden_id | summe |
|---|---|---|
| 100 | 1 | 89,90 € |
| 101 | 3 | 12,50 € |
| 102 | 1 | 249,00 € |
| kunden_id | name |
|---|---|
| 1 | Anna Bauer |
| 2 | Tim Schulz |
| 3 | Lisa Wagner |
kunden_id-Werte in bestellungen (1, 3, 1) finden ein Gegenstück in kunden. Referenzielle Integrität ist gewahrt.kunden_id = 99 einzufügen würde das DBMS mit ERROR 1452: Cannot add or update a child row: a foreign key constraint fails abbrechen. Spannender wird's beim Löschen auf der Eltern-Seite: wenn Kunde 1 gelöscht werden soll, hängen die Bestellungen 100 und 102 in der Luft. Hier muss man entscheiden ob die Bestellungen mitgelöscht werden, ob der Vorgang abgelehnt wird oder ob die kunden_id auf NULL gesetzt wird. Das regeln die Klauseln ON DELETE und ON UPDATE – Details in Lektion 3.5) Domänenintegrität – nur erlaubte Werte
„Domäne" meint hier den Wertebereich einer Spalte. Eine Spalte alter ist eine Ganzzahl, vermutlich zwischen 0 und 150. Eine Spalte email ist Text mit @-Zeichen. Eine Spalte status nimmt vielleicht nur die drei Werte 'aktiv', 'inaktiv', 'gesperrt' an. Die Domänenintegrität sorgt dafür dass nur Werte aus dem erlaubten Bereich in die Spalte kommen.
Drei Mechanismen tragen dazu bei, alle drei lernst du beim Tabellen-Erstellen mit SQL kennen:
- Datentyp – durch die Wahl von
INT,VARCHAR(50),DATE,DECIMAL(10,2)usw. legst du fest welche Art von Wert überhaupt erlaubt ist. EinINT-Feld nimmt schlicht keinen Text an. - NOT NULL – wenn ein Feld immer einen Wert haben muss (z.B. Nachname eines Kunden), markiert man es als
NOT NULL. Ein Insert ohne diesen Wert schlägt fehl. - CHECK-Constraints – feinere Regeln für den Wertebereich. Beispiele:
CHECK (alter >= 18),CHECK (status IN ('aktiv', 'inaktiv', 'gesperrt')),CHECK (preis > 0).
Zusätzlich gibt es UNIQUE (jeder Wert nur einmal, aber im Gegensatz zum Primary Key sind NULL-Werte erlaubt) und DEFAULT (Vorgabewert wenn keiner mitgegeben wird). Das ist die alltäglichste Form von Integrität – fast jede Spalte hat irgendeine Form von Domänen-Constraint.
6) Benutzerdefinierte Integrität – die Geschäftsregeln
Manche Regeln kann das DBMS nicht aus dem Schema ableiten – sie ergeben sich aus deinem konkreten Geschäftsfall. Ein paar Beispiele aus der Praxis:
- „Ein Mitarbeiter darf pro Jahr maximal 30 Urlaubstage haben."
- „Die Summe einer Bestellung muss gleich der Summe aller Bestellpositionen sein."
- „Ein Lager darf nicht mehr Ware ausweisen als physisch passt."
- „Ein Kunde ohne aktive Mitgliedschaft darf keine Premium-Inhalte kaufen."
Diese benutzerdefinierten (oder semantischen) Constraints kennt die Datenbank nicht von selbst. Es gibt zwei Strategien sie durchzusetzen: im DBMS per CHECK-Constraint, Trigger oder Stored Procedure – oder in der Anwendung, also dem Programmcode der die Datenbank benutzt. Die saubere Lösung kombiniert beide: die wichtigsten Invarianten als Datenbank-Constraint (damit sie wirklich nie verletzt werden, egal welcher Client schreibt), die feineren Geschäftslogiken in der Applikation.
7) DBMS als Türsteher – probier's mal aus
Wir spielen jetzt die andere Seite: du bist ein bösartiger Client und versuchst, Müll-Daten in eine sauber konfigurierte Datenbank zu schmuggeln. Klick einen der Angriffe und sieh wie das DBMS reagiert:
produkte| id PK | name | preis CHECK>0 | kategorie_id FK→kategorien | lager INT NOT NULL |
|---|---|---|---|---|
| 1 | Tastatur | 49,90 | 10 | 23 |
| 2 | Maus | 19,90 | 10 | 57 |
8) Detektiv-Modus: Welcher Integritätstyp wurde verletzt?
Jetzt du. Sechs Szenarien aus der Praxis – jeweils geht's schief, und du musst entscheiden welcher der vier Integritätstypen verletzt wurde. Klick die Antwort die deiner Meinung nach passt:
9) Konsequenzen: Datenbank mit vs. ohne Integrität
Zum Abschluss der Vergleich. Was unterscheidet eine Datenbank mit ordentlich konfigurierten Constraints von einer ohne? Auf den ersten Blick: in beiden stehen Daten. Auf den zweiten Blick wird der Unterschied dramatisch:
- Doppelte Kunden – Marketing schreibt drei mal an, Support öffnet drei Tickets
- Bestellungen ohne Kunden – Reports zeigen Umsatz von Geister-Käufern
- Negative Preise, Datum „32.13.2024", Alter „-5"
- Jeder neue Client muss alle Prüfungen selbst neu schreiben
- Fehler kommen still in die Datenbank, nicht beim Insert
- Migrationen werden zum Albtraum, weil nichts garantiert ist
- Jede Entität existiert genau einmal
- Jede Beziehung verweist auf existierende Zeilen
- Werte sind im erlaubten Bereich – kein Müll-Format
- Geschäftsregeln werden zentral durchgesetzt, nicht in jedem Client
- Fehler kommen früh – beim Insert, mit klarer Fehlermeldung
- Du kannst dich auf die Daten verlassen – Reports, Joins, Statistik
Zusammenfassung
Datenintegrität ist die Eigenschaft, dass Daten in einer Datenbank korrekt, eindeutig, konsistent und plausibel sind – und vom DBMS auch so erhalten werden. Vier Integritätstypen: Entitätsintegrität (jede Zeile eindeutig identifizierbar via Primary Key, automatisch NOT NULL + UNIQUE), referenzielle Integrität (Foreign Keys verweisen nur auf existierende Zeilen, Verhalten beim Löschen/Ändern via ON DELETE/ON UPDATE), Domänenintegrität (nur Werte aus dem erlaubten Wertebereich – durch Datentyp, NOT NULL, CHECK, UNIQUE), benutzerdefinierte Integrität (Geschäftsregeln, die das DBMS nicht von selbst kennt – via CHECK, Trigger, Stored Procedures oder in der Anwendung). Constraints werden im Schema definiert (CREATE TABLE) und vom DBMS bei jedem Insert/Update geprüft. Ohne Integrität: Datenchaos. Mit Integrität: verlässliche Datengrundlage.
