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.
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.
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.
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.
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
".
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.
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');
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".
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.
INSERT INTO firmensitze VALUES (1,'Deutschland',1,'Berlin',500,100);
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.
INSERT INTO firmensitze VALUES (1,'Deutschland',1,'Berlin',100,500);
Weiter mit Tabellen in Beziehungen