Grundkurs SQL

7.3.4  Domain Integrität – Prüfen mit CHECK

In den nächsten beiden Abschnitten wird es um die Darstellung der Domain-Integritätsbedingungen in SQL gehen. Wir beginnen mit dem CHECK-Constraint. Es erlaubt einen beliebigen Ausdruck anzugeben, den jeder Wert einer Spalte erfüllen muss.

Leider funktioniert das CHECK nicht in MySQL, so dass dieser Abschnitt nur theoretisch sein wird.

Nehmen wir unser Beispiel der Mitarbeitertabelle. Es dürfte sinnvoll sein zu verhindern, dass versehentlich Bruttolöhne von mehr als 10.000 Euro eingegeben werden. Um den Wertebereich eines Attributes einzuschränken, kennt SQL das Sprachelement CHECK.

CHECK wird wie bei den anderen beiden Integritätsbedingungen auch durch das Schlüsselwort CONSTRAINT und eine Bezeichnung für diese Einschränkung eingeleitet. Darauf folgt das Wort CHECK und dann die Bedingung, die bei Einfügen eines Satzes in die Tabelle der Datenbank erfüllt sein muss.

Für das Beispiel Bruttolohn sähe das dann wie folgt aus (Sie können es ausprobieren, die SQL - Anweisung wird auch korrekt ausgeführt, nur leider funktioniert der 'check' nicht, sie können auch Bruttolöhne über 10.000 Euro eintragen.):

CREATE TABLE mitarbeiter
  (
    personal_ID CHAR(4) NOT NULL,
    name VARCHAR(30) NOT NULL,
    strasse VARCHAR(50) NOT NULL,
    plz VARCHAR(5) NULL DEFAULT '00000',
    geburtsdatum DATE NULL DEFAULT '0000-00-00',
    bruttolohn real NOT NULL DEFAULT 0,
    CONSTRAINT primaryKey_mitarbeiter PRIMARY KEY (personal_ID),
    CONSTRAINT foreignKey_mitarbeiter FOREIGN KEY (plz)
                  REFERENCES ort(plz)
                  ON DELETE SET NULL
                  ON UPDATE CASCADE,
    CONSTRAINT pruefe_bruttolohn CHECK (bruttolohn <= 10000)

  ) ENGINE=INNODB

Spätestens an dieser Stelle muss darauf hingewiesen werden, dass man viele Constraints wie CHECK oder PRIMARY KEY auch kürzer notieren kann. Dabei entfällt jedoch die Angabe einer Bezeichnung für die Einschränkung, mit welcher Fehlermeldungen eindeutiger werden und die es erlaubt auf den Constraint zu verweisen, wenn er geändert oder gelöscht werden soll.

Bei der verkürzten Form erfolgt die Definition der Einschränkung direkt in der Zeile der Spaltendefinition und zwar hinter dem Datentyp.
Im Falle des CHECK-Constraints besteht diese dann nur noch aus dem Schlüsselwort CHECK gefolgt von dem Ausdruck in Klammern, der die Bedingung festlegt.

    ...
        bruttolohn real NOT NULL DEFAULT 0 CHECK (bruttolohn <= 10000),
    ...

Constraints die man auch so definieren kann nennt man Spalten-Constraint, während die bisher verwendeten Tabellen-Constraints sind, weil sie getrennt von den Spaltendefinitionen geschrieben wurden.
Spalten-Constraints können auch als Tabellen-Constraints geschrieben werden, aber umgekehrt ist das nicht immer möglich.