NOT NULL und DEFAULT
Eine Spalte ohne Regel darf leer bleiben: Wenn ein INSERT sie weglässt, bekommt sie NULL. Manchmal ist das richtig, etwa beim Erscheinungsdatum eines Spiels, das noch nicht draußen ist. Aber ein Spiel ohne Titel oder Preis ergibt keinen Sinn. NOT NULL nach dem Typ der Spalte sagt, dass die Spalte immer einen Wert haben muss. So wurde die Tabelle spiele von Pixel Shop erstellt:
CREATE TABLE spiele (
id INTEGER PRIMARY KEY,
titel TEXT NOT NULL,
genre TEXT NOT NULL,
preis INTEGER NOT NULL,
erschienen TEXT,
altersfreigabe INTEGER NOT NULL
) STRICT;Jede Spalte hat NOT NULL außer erschienen, der einzigen, die leer bleiben darf. (id braucht es nicht: Ein Primärschlüssel ist nie NULL.) Ein INSERT, der eine NOT NULL-Spalte weglässt oder ihr NULL gibt, schlägt fehl, wie du in der letzten Lektion gesehen hast:
INSERT INTO spiele (titel, genre, preis)
VALUES ('Snow Trails', 'Sport', 20);Error on line 1: NOT NULL constraint failed: spiele.altersfreigabeDEFAULT gibt einer Spalte den Wert, den sie bekommt, wenn ein INSERT sie weglässt. Zum Beispiel eine Tabelle für die Abonnenten des Newsletters des Shops:
CREATE TABLE abonnenten (
id INTEGER PRIMARY KEY,
email TEXT NOT NULL,
sprache TEXT NOT NULL DEFAULT 'de',
aktiv INTEGER NOT NULL DEFAULT 1
) STRICT;
INSERT INTO abonnenten (email)
VALUES ('emma.becker@mail.de');
INSERT INTO abonnenten (email, sprache)
VALUES ('sam.carter@mail.com', 'en');
SELECT * FROM abonnenten;| id | sprache | aktiv | |
|---|---|---|---|
| 1 | emma.becker@mail.de | de | 1 |
| 2 | sam.carter@mail.com | en | 1 |
Niemand musste die Sprache des ersten Abonnenten angeben oder dass beide Abonnements aktiv sind. NOT NULL und DEFAULT passen gut zusammen: Die Spalte hat immer einen Wert, und ein INSERT muss ihn nur angeben, wenn er abweicht. Du kannst die beiden in beliebiger Reihenfolge schreiben. Der Standardwert kann eine Zahl sein, ein Text in einfachen Anführungszeichen oder CURRENT_DATE, das heutige Datum: Eine Spalte hinzugefuegt TEXT NOT NULL DEFAULT CURRENT_DATE merkt sich den Tag, an dem jede Zeile eingefügt wurde.
Typischer Fehler: zu erwarten, dass DEFAULT ein NULL ersetzt. Der Standardwert wird nur verwendet, wenn der INSERT die Spalte weglässt. Ein NULL, das im INSERT steht, bleibt NULL, und mit NOT NULL ist das ein Fehler:
INSERT INTO abonnenten (email, sprache)
VALUES ('tim.lorenz@mail.de', NULL);Error on line 1: NOT NULL constraint failed: abonnenten.spracheSo schreibst du es:
Anweisungen
- 1
Der Support des Shops bekommt Anfragen von Kunden. Erstelle eine
STRICT-Tabelleanfragenmit diesen Spalten, in dieser Reihenfolge:id– ein Ganzzahl-Primärschlüssel,betreff– Text, der immer ausgefüllt sein muss,status– Text, der immer ausgefüllt sein muss; wenn einINSERTihn weglässt, ist er'offen',dringlichkeit– eine Ganzzahl, die immer ausgefüllt sein muss; wenn einINSERTsie weglässt, ist sie 2.
- 2
Füge drei Anfragen ein, jeweils nur mit den hier genannten Spalten:
- Betreff
'Goal Rush lässt sich nicht herunterladen', sonst nichts, - Betreff
'Erstattung für Bestellung 18'und Status'geschlossen', - Betreff
'Falscher Preis im Warenkorb'und Dringlichkeit 1.
Zeige dann die ganze Tabelle, sortiert nach
id:id betreff status dringlichkeit 1 Goal Rush lässt sich nicht herunterladen offen 2 2 Erstattung für Bestellung 18 geschlossen 2 3 Falscher Preis im Warenkorb offen 1 - Betreff