UNIQUE und CHECK
Ein Primärschlüssel stellt sicher, dass keine zwei Zeilen dieselbe ID haben. Oft muss auch eine andere Spalte eindeutig sein: Zwei Kunden dürfen sich keine E-Mail-Adresse teilen, sonst wüsste der Shop nicht, wessen Konto es ist. UNIQUE nach dem Typ der Spalte sagt genau das. Die Turniere des Shops könnten ihre Spieler so speichern:
CREATE TABLE spieler (
id INTEGER PRIMARY KEY,
spitzname TEXT NOT NULL UNIQUE,
alter_jahre INTEGER NOT NULL CHECK (alter_jahre >= 13)
) STRICT;Ein zweiter Spieler mit einem Spitznamen, der schon vergeben ist, wird abgelehnt. Keine der beiden Zeilen wird eingefügt: Eine Anweisung, die fehlschlägt, ändert nichts.
INSERT INTO spieler (spitzname, alter_jahre)
VALUES ('Nachteule', 15),
('Nachteule', 22);Error on line 1: UNIQUE constraint failed: spieler.spitznameUNIQUE erlaubt NULL, sogar mehrmals: NULL bedeutet kein Wert, und ein fehlender Wert ist nicht gleich einem anderen. Wenn die Spalte immer einen Wert haben muss, füge NOT NULL hinzu, wie oben. Die E-Mail-Adresse der Kunden des Shops ist ebenfalls TEXT NOT NULL UNIQUE.
CHECK (gefolgt von einer Bedingung in Klammern) stellt eine Regel auf, die jede Zeile erfüllen muss. Die Bedingung wird wie in WHERE geschrieben, und die Turniere oben sind für Spieler ab 13 Jahren:
INSERT INTO spieler (spitzname, alter_jahre)
VALUES ('Mini', 11);Error on line 1: CHECK constraint failed: alter_jahre >= 13Auch die Tabellen des Shops verwenden CHECK: Die Sterne einer Bewertung müssen BETWEEN 1 AND 5 liegen, die Menge > 0 sein und der Status einer Bestellung IN ('bezahlt', 'erstattet'). Ein CHECK, der zwei Spalten vergleicht, oder ein UNIQUE für zwei Spalten zusammen, wird nach der letzten Spalte in einer eigenen Zeile geschrieben:
CREATE TABLE turniere (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
beginn TEXT NOT NULL,
ende TEXT NOT NULL,
CHECK (ende >= beginn),
UNIQUE (name, beginn)
) STRICT;UNIQUE (name, beginn) erlaubt zwei Turniere mit demselben Namen und zwei, die am selben Tag beginnen, aber nicht zwei mit demselben Namen am selben Tag.
Typischer Fehler: zu vergessen, dass CHECK NULL durchlässt. Mit NULL in alter_jahre ist die Bedingung alter_jahre >= 13 weder wahr noch falsch, und CHECK lehnt eine Zeile nur ab, wenn ihre Bedingung falsch ist. Deshalb braucht eine Spalte mit CHECK meist auch NOT NULL.
So schreibst du es:
Anweisungen
- 1
Der Shop möchte Rabattgutscheine verteilen. Erstelle eine
STRICT-Tabellegutscheinemit diesen Spalten, in dieser Reihenfolge:id– ein Ganzzahl-Primärschlüssel,code– Text, immer ausgefüllt, und keine zwei Gutscheine dürfen denselben Code haben,rabatt– der Rabatt in Prozent, eine Ganzzahl, immer ausgefüllt, von 5 bis 50,gueltig_bis– der letzte Tag, an dem der Gutschein eingelöst werden kann, immer ausgefüllt.
- 2
Füge diese vier Gutscheine ein (Code, Rabatt, letzter Tag):
'WILLKOMMEN10', 10, '2026-12-31''WINTER25', 25, '2026-02-28''BLITZ50', 50, '2026-01-15''FRUEHLING10', 10, '2026-05-31'
Zeige dann die ganze Tabelle, sortiert nach dem Rabatt, der größte zuerst, und Gutscheine mit demselben Rabatt nach ihrem Code:
id code rabatt gueltig_bis 3 BLITZ50 50 2026-01-15 2 WINTER25 25 2026-02-28 4 FRUEHLING10 10 2026-05-31 1 WILLKOMMEN10 10 2026-12-31