CodeGym /Kurse /SQL SELF /Arbeiten mit dem CHECK-Constraint zur Daten...

Arbeiten mit dem CHECK-Constraint zur Datenprüfung

SQL SELF
Level 17 , Lektion 3
Verfügbar

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?

  1. Datenqualität sichern: CHECK verhindert, dass falsche oder unlogische Infos in die Tabelle gelangen.
  2. Fehlerwahrscheinlichkeit senken: Anstatt die Daten vor dem Einfügen manuell zu prüfen, kannst du das der Datenbank überlassen.
  3. 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:

  1. Online-Shops: Verbot, Produkte mit negativem Preis hinzuzufügen.
  2. Lernplattformen: Altersprüfung für Kursteilnehmer.
  3. 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 CHECK mü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 NULL ist. Anders gesagt: CHECK (age >= 18) gibt keinen Fehler für age = NULL aus. Das liegt daran, dass jeder Ausdruck mit NULL automatisch zu "unbestimmt" wird. Wenn du NULL verbieten willst, füge NOT NULL hinzu.

  • Komplexe Bedingungen im CHECK können die Performance beim Einfügen und Aktualisieren von Daten verschlechtern, besonders bei großen Tabellen.

Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION