Das CHECK-Constraint ist sozusagen der Türsteher deiner Tabelle. Es stellt sicher, dass die Daten, die du in die Tabelle einfügst, bestimmten Bedingungen entsprechen. Wenn du Daten einfügst, die diese Bedingungen verletzen, lehnt die Datenbank sie einfach ab.
Stell dir vor, du willst einen Laden in Deutschland eröffnen. Aber laut Gesetz ist Sonntag ein Ruhetag und Handel ist an diesem Tag verboten. Dieses Verbot ist wie ein CHECK-Constraint in der Datenbank. Du versuchst, den Öffnungsplan des Ladens anzugeben: geöffnet 7 Tage die Woche, aber das System sagt sofort: "Nein, nein, Sonntag – das ist ein Verstoß. So ein Zeitplan geht nicht durch die Prüfung!"
Genauso in der Datenbank: Wenn du einen Wert angibst, der gegen die CHECK-Regel verstößt, blockiert das System ihn, damit kein "logischer Fehler" in die Daten kommt.
Wozu braucht man CHECK?
- Datenqualität sichern:
CHECKverhindert, dass falsche oder unlogische Infos in die Tabelle gelangen. - Fehlerwahrscheinlichkeit senken: Anstatt die Daten vor dem Einfügen manuell zu prüfen, kannst du das der Datenbank überlassen.
- Logik bleibt unabhängig: Die Prüfregeln kannst du direkt in die Datenbankstruktur einbauen, statt sie im Anwendungscode zu verstecken.
Wie funktioniert CHECK?
Das CHECK-Constraint wird beim Erstellen der Tabelle gesetzt oder kann später mit ALTER TABLE hinzugefügt werden. Hier ist die Grundsyntax:
CREATE TABLE tabelle (
spalte datentyp CHECK (bedingung)
);
bedingung ist ein logischer Ausdruck, der für jeden Wert in der angegebenen Spalte erfüllt sein muss. Wenn die Bedingung verletzt wird, gibt die Datenbank einen Fehler aus.
Beispiel 1: Wertebereich prüfen
Lass uns eine Tabelle students erstellen, in der das Alter der Studierenden (age) zwischen 16 und 100 liegen muss:
CREATE TABLE students (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
age INTEGER CHECK (age >= 16 AND age <= 100)
);
Wenn du jetzt versuchst, einen Studenten mit Alter 12 einzufügen, erwischt dich die Datenbank sofort:
INSERT INTO students (name, age)
VALUES ('Maria Chi', 12);
Fehler:
ERROR: new row for relation "students" violates check constraint "students_age_check"
DETAIL: Failing row contains (1, Maria Chi, 12).
Ja, die Datenbank ist hier ein strenger Türsteher. Kein 16 – kein Einlass.
Beispiel 2: Datenformat prüfen
Angenommen, wir haben eine Tabelle emails, in der eine Liste von E-Mail-Adressen gespeichert wird. Wir wollen sicherstellen, dass die Adressen das Zeichen @ enthalten (das ist eine vereinfachte Prüfung):
CREATE TABLE emails (
id SERIAL PRIMARY KEY,
email VARCHAR(255) CHECK (email LIKE '%@%')
);
Versuchen wir, eine ungültige Adresse einzufügen, die die Bedingung nicht erfüllt:
INSERT INTO emails (email)
VALUES ('notanemail.com');
Fehler:
ERROR: new row for relation "emails" violates check constraint "emails_email_check"
DETAIL: Failing row contains (1, notanemail.com).
Den Fehler kannst du vermeiden, wenn alle Daten das Zeichen @ enthalten:
INSERT INTO emails (email)
VALUES ('example@student.com');
Die Anfrage läuft erfolgreich durch.
Beispiel 3: Bedingungen für mehrere Spalten prüfen
CHECK-Constraints können nicht nur eine Spalte prüfen, sondern auch logische Ausdrücke, die mehrere Spalten betreffen. Schauen wir uns ein Beispiel mit der Tabelle employees an, wo das Gehalt (salary) größer als der Bonus (bonus) sein muss:
CREATE TABLE employees (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
salary NUMERIC CHECK (salary > 0),
bonus NUMERIC CHECK (bonus >= 0),
CHECK (salary > bonus)
);
Wenn jetzt jemand versucht, einen Mitarbeiter hinzuzufügen, bei dem der Bonus größer als das Gehalt ist, lässt die Datenbank das nicht zu:
INSERT INTO employees (name, salary, bonus)
VALUES ('Otto Lin', 3000, 4000);
Fehler:
ERROR: new row for relation "employees" violates check constraint "employees_salary_bonus_check"
DETAIL: Failing row contains (1, Otto Lin, 3000, 4000).
Praxiseinsatz
Das CHECK-Constraint hilft immer dann, wenn deine Business-Logik eng mit Datenbeschränkungen verknüpft ist. Zum Beispiel:
- Online-Shops: Verbot, Produkte mit negativem Preis hinzuzufügen.
- Lernplattformen: Altersprüfung für Kursteilnehmer.
- Medizinische Systeme: Sicherstellen, dass die Körpertemperatur eines Patienten im erlaubten Bereich liegt.
Diese Prüfungen sind nicht nur ein zusätzlicher Sicherheitslayer, sie sparen auch Zeit und Nerven für Entwickler und User.
Besonderheiten und typische Fehler
Wenn du mit CHECK arbeitest, beachte Folgendes:
Logische Ausdrücke im
CHECKmüssen für alle Zeilen der Tabelle wahr sein. Wenn auch nur eine Zeile gegen die Regel verstößt, musst du sie vor dem Hinzufügen des Constraints anpassen.Die Prüfung wird nicht ausgeführt, wenn der eingefügte Wert
NULList. Anders gesagt:CHECK (age >= 18)gibt keinen Fehler fürage = NULLaus. Das liegt daran, dass jeder Ausdruck mitNULLautomatisch zu "unbestimmt" wird. Wenn duNULLverbieten willst, fügeNOT NULLhinzu.Komplexe Bedingungen im
CHECKkönnen die Performance beim Einfügen und Aktualisieren von Daten verschlechtern, besonders bei großen Tabellen.
GO TO FULL VERSION