Einschränkungen (CONSTRAINTS)

Einschränkungen auf Tabellenebene.

Mit den Einschränkungen: "PRIMARY KEY", "NOT NULL", "UNIQUE", "DEFAULT" und "CHECK" können wir einzelne Spalten einer Tabelle definieren. In SQL können wir aber auch Einschränkungen auf Tabellenebene definieren. Dabei können wir die bereits bekannten Schlüsselwörter: "PRIMARY KEY", "UNIQUE" und "CHECK" verwenden. Die Schlüsselwörter "DEFAULT" und "NOT NULL" stehen uns bei der Definition auf Tabellenebene leider nicht zur Verfügung.


PRIMARY KEY

Betrachten wir zunächst den Code.

Info!

Tabellen können nicht doppelt angelegt werden.

Sollte auf die bestehende Tabelle "kleidung" eine neue Tabelle mit dem gleichen Name folgen, kann die Datenbank diese nicht anlegen, weil die eindeutige Zuweisung fehlt. Zum Rumprobieren entweder einen anderen Tabellenname wie "kleidung1", "kleidung2", "kleidung3" usw. vergeben oder die alte Tabelle aus der Datenbank löschen, um eine neue mit den Namen "kleidung" erstellen zu können.

CONSTRAINT in SQL

CREATE TABLE kleidung (
 artikelnummer INT,
 artikelbezeichnung VARCHAR(50) NOT NULL,
 farbe VARCHAR(50) CHECK (farbe='Blau' OR farbe='Rot' OR farbe='Schwarz'),
 produktionsdatum DATE UNIQUE,
 preis DECIMAL(5,2) DEFAULT 999.99,
 CONSTRAINT pk_artikelnummer PRIMARY KEY (artikelnummer)
);

In der ersten Zeile erkennen wir, dass die Spalte "artikelnummer" keine Zuordnung zum "PRIMARY KEY" mehr hat. Stattdessen wird hinter der letzten Spalte durch das Schlüsselwort "CONSTRAINT" eine Einschränkungsdefinition erstellt. Nach dem Schlüsselwort "CONSTRAINT" geben wir den Namen für die Einschränkung an. Die Bezeichnung "pk_artikelnummer" lässt Aufschluss darüber, dass es sich um eine Primärschlüsseleinschränkung handelt. Jetzt folgt die eigentliche Einschränkung, hier wird wie bei der Spaltendefinition der "PRIMARY KEY" definiert. Als Nächstes wird angegeben, welche Spalte als Primärschlüssel verwendet werden soll. In diesem Fall ist es die Spalte "artikelnummer".

Eine Primärschlüsselverletzung auf Tabellenebene wird wie eine Primärschlüsselverletzung auf Spaltenebene auch einen Fehler werfen.


Leider ist nicht jede Primärschlüsseldefinition so einfach wie im oberen Beispiel. Betrachten wir doch einfach mal den Fall von verschiedenen Produktionsstätten für die Bekleidung. Die Produktionsstätten befinden sich in unterschiedlichen Ländern, aber in einem einzelnen Land können auch mehrere Produktionsstätten ansässig sein.

Spaltenname Datentyp Beispielwert Primärschlüssel
land VARCHAR(50) Deutschland X
niederlassung_im_land TINYINT 1 X
ort VARCHAR(50) Berlin

Wir erstellen die Tabelle "firmensitze", in der wir die Spalten "land", "niederlassung_im_land" und "ort" anlegen werden. Durch die Verwendung von gleich 2 Primärschlüsselspalten in einer Tabelle geben wir vor, dass eine Kombination aus beiden Spalten eine eindeutige Identifikation ermöglichen muss. Man redet hierbei auch von einem "zusammengesetzten Primärschlüssel". Diese Art von Primärschlüssel kann durch 2 oder noch mehr Spalten nur auf Tabellenebene definiert werden. Wenn wir solche zusammengesetzten Primärschlüssel verwenden möchten, dann werden diese bei der Tabellendefinition in einem Klammerpaar durch ein Komma getrennt angegeben.

Zusammengesetzter Primärschlüssel

CREATE TABLE firmensitze (
 land VARCHAR(50),
 niederlassung_im_land TINYINT,
 ort VARCHAR(50),
 CONSTRAINT pk_zweigstellen PRIMARY KEY (land,niederlassung_im_land)
);

Definieren wir doch einfach mal ein paar Fabriken und betrachten anschließend das Beispiel.

Fabriken erstellen

INSERT INTO firmensitze VALUES ('Deutschland',1,'Berlin');
INSERT INTO firmensitze VALUES ('Deutschland',2,'Köln');
INSERT INTO firmensitze VALUES ('China',1,'Dongguan');
INSERT INTO firmensitze VALUES ('China',2,'Xinxiang');

Im Beispiel ist gut zu erkennen, dass die Datenbank die einzelnen Datensätze durch den zusammengesetzten Primärschlüssel eindeutig identifizieren kann.

Datenbankausgabe mit zusammengesetztem Primärschlüssel

UNIQUE

Die Einschränkung mit "UNIQUE" kann auch auf Tabellenebene definiert werden. Wie auch bei der Definition auf Spaltenebene sorgt die "UNIQUE"-Einschränkung auf Tabellenebene dafür, dass nicht 2 gleiche Werte in einer Spalte definiert werden. Oder besser gesagt mit Ihr kann auch ein zusammengesetzter Schlüssel auf Tabellenebene erzeugt werden, also sehr ähnlich zum "PRIMARY KEY".

UNIQUE-Einschränkung

CREATE TABLE firmensitze (
 fabrik_id TINYINT PRIMARY KEY,
 land VARCHAR(50),
 niederlassung_im_land TINYINT,
 ort VARCHAR(50),
 CONSTRAINT uq_zweigstellen UNIQUE (land,niederlassung_im_land)
);

Füttern wir die Tabelle wieder mit Daten.

Fabriken erstellen

INSERT INTO firmensitze VALUES (1,'Deutschland',1,'Berlin');
INSERT INTO firmensitze VALUES (2,'Deutschland',2,'Köln');
INSERT INTO firmensitze VALUES (3,'China',1,'Dongguan');
INSERT INTO firmensitze VALUES (4,'China',2,'Xinxiang');
Datenbankausgabe nach UNIQUE-Einschränkung

Auch wenn ein neuer Eintrag zwar eine neue "fabrik_id" bekommt, aber aus Deutschland oder China stammt und die "niederlassung_im_land" den Wert 1 oder 2 hat, dann gilt das als Verletzung der "UNIQUE"-Einschränkung und die Datenbank wird einen Fehler auswerfen.


CHECK

Mit der "CHECK"-Einschränkung auf Tabellenebene können wir gewährleisten, dass Datensätze mit einer "INSERT" oder "UPDATE"-Anweisung nur in die Tabelle eingetragen werden können, bei denen die Plausibilitätsprüfung bestanden wurde.

Die Fabrik soll nur in der Tabelle aufgenommen werden können, wenn die Zahlen von der Spalte "verkauf" größer sind als die Zahlen der Spalte "ausgaben".

Plausibilitätsprüfung

CREATE TABLE firmensitze (
 fabrik_id TINYINT PRIMARY KEY,
 land VARCHAR(50),
 niederlassung_im_land TINYINT,
 ort VARCHAR(50),
 verkauf INT,
 ausgaben INT,
 CONSTRAINT ch_kostenvergleich CHECK (verkauf>ausgaben)
);

Solange der Wert in der Spalte "verkauf" größer ist als der Wert in der Spalte "ausgaben", ist die Produktionsstätte gewinnbringend und kann in die Datenbank mit aufgenommen werden.

Gewinnbringende Fabrik

INSERT INTO firmensitze VALUES (1,'Deutschland',1,'Berlin',500,100);
Datenbankausgabe nach gelungender Plausibilitätsprüfung

Wenn der Wert der Spalte "verkauf" aber kleiner ist als der Wert der Spalte "ausgaben", ist die Plausibilitätsprüfung nicht erfolgreich und die Datenbank gibt eine Fehlermeldung aus.

Verlustbringende Fabrik

INSERT INTO firmensitze VALUES (1,'Deutschland',1,'Berlin',100,500);

Weiter mit Tabellen in Beziehungen