0%

Eine Tabelle erstellen, die ihre Daten schützt · Übung

Inventarkennzeichen eindeutig halten

Wenn ein Geräteraum zwei identische Akkubohrer besitzt, können beide Datensätze durchaus den Namen Cordless drill verwenden. Ihre Inventarkennzeichen haben eine andere Aufgabe: Jedes muss auf einen einzelnen physischen Bohrer verweisen. Stell dir vor, du scannst TOOL-104 am Verleihtresen. SQLite soll dem Programm niemals zwei passende Gegenstände liefern, zwischen denen es wählen müsste.

Das soll passieren, wenn das Verleihprogramm versucht, vier Datensätze zu speichern:

idasset_tagnameWas SQLite tun soll
21TOOL-104Cordless drillSpeichern
22TOOL-105Cordless drillSpeichern
23TOOL-104Folding tableAblehnen
24NULLProjectorAblehnen

Ein wiederholter Name ist hier harmlos. Ein exakt wiederholtes Inventarkennzeichen macht es dagegen unmöglich zu wissen, welchen Gegenstand dieses Kennzeichen identifiziert.

Die fehlende Regel finden

Bevor du etwas bearbeitest, sieh dir die aktuelle Deklaration in schema.sql an:

asset_tag TEXT NOT NULL,

Diese Zeile lehnt den vierten Datensatz bereits ab, weil sein Kennzeichen NULL ist. Nichts auf der Zeile lehnt jedoch den dritten Datensatz ab. Aus Sicht des aktuellen Schemas ist ein weiteres TOOL-104 in Ordnung.

Öffne schema.sql und füge hinter NOT NULL den Zusatz UNIQUE ein, sodass die Zeile so lautet:

asset_tag TEXT NOT NULL UNIQUE,

Lass den Rest der Tabelle unverändert und klicke dann auf Run. Finde die geänderte Zeile innerhalb der vollständigen Definition, die SQLite ausgibt.

UNIQUE ergänzt eine Regel, die verhindert, dass zwei Zeilen denselben Wert in dieser Spalte tragen. Hier schützt sie die Verbindung zwischen einem Inventarkennzeichen und einem physischen Gegenstand. Die beiden Zeilen mit Cordless drill sind weiterhin erlaubt, weil name diese Regel nicht hat.

Behalte NOT NULL neben UNIQUE bei. Die beiden Regeln lösen unterschiedliche Probleme: UNIQUE lehnt ein wiederholtes Kennzeichen ab, während NOT NULL ein fehlendes Kennzeichen ablehnt. UNIQUE allein würde in SQLite weiterhin mehr als einen NULL-Wert erlauben.

Diese Regel erkennt exakte Wiederholungen. Beim üblichen Textvergleich von SQLite sind TOOL-104 und tool-104 unterschiedliche Werte. Damit Kennzeichen die Groß- und Kleinschreibung ignorieren, wäre eine weitere Regel nötig. Das machen wir hier deshalb nicht.

Wähle Submit, um die Regel mit neuen Datensätzen zu prüfen. Doppelte Namen mit unterschiedlichen Kennzeichen sollen funktionieren, ein wiederholtes oder fehlendes Kennzeichen nicht. Wenn sich ein Datensatz anders verhält, gehe zur Zeile asset_tag zurück und stelle sicher, dass sowohl NOT NULL als auch UNIQUE noch vorhanden sind.

Deine Tabelle kann jetzt ein Kennzeichen ablehnen, das auf zwei verschiedene Gegenstände verweisen würde, ohne zwei Gegenstände mit zufällig gleichem Namen zu verbieten. Genau diese Unterscheidung muss ein Inventarkennzeichen schützen.

Aufgabe

Öffne schema.sql und mache jedes asset_tag eindeutig. Behalte die vorhandene Regel NOT NULL für diese Spalte bei.

Klicke auf Run und bestätige, dass SQLite die vollständige Tabellendefinition akzeptiert. Reiche dann dein Schema ein. Zwei Gegenstände mit unterschiedlichen Kennzeichen dürfen denselben Namen haben, aber sowohl ein exakt wiederholtes Kennzeichen als auch ein Kennzeichen mit NULL müssen abgelehnt werden.