Primärschlüssel
In Lektion 1 hast du den Primärschlüssel kennengelernt: die Spalte, die jede Zeile identifiziert, wie id in spiele. Ein Primärschlüssel folgt zwei Regeln: Keine zwei Zeilen haben denselben Wert darin, und er ist nie NULL. Deshalb findet WHERE id = 5 immer höchstens eine Zeile, und andere Tabellen können über seinen Schlüssel auf eine Zeile zeigen.
Eine Spalte wird zum Primärschlüssel, wenn du PRIMARY KEY nach ihrem Typ schreibst. Zum Beispiel eine Tabelle von Genres:
CREATE TABLE genres (
id INTEGER PRIMARY KEY,
name TEXT
) STRICT;In SQLite tut INTEGER PRIMARY KEY noch etwas: Wenn ein INSERT die Spalte weglässt, wählt SQLite die Nummer selbst. Es nimmt die größte Nummer in der Tabelle plus eins oder 1, wenn die Tabelle leer ist. Daher kamen die automatischen IDs der letzten Lektion:
INSERT INTO genres (name)
VALUES ('RPG'), ('Rennspiel'), ('Puzzle');
SELECT * FROM genres;| id | name |
|---|---|
| 1 | RPG |
| 2 | Rennspiel |
| 3 | Puzzle |
Du kannst die ID weiterhin selbst angeben, aber eine Nummer, die vergeben ist, wird abgelehnt. Die Meldung sagt UNIQUE, weil ein Primärschlüssel eindeutig ist; mehr über UNIQUE lernst du gleich:
INSERT INTO genres (id, name)
VALUES (2, 'Sport');Error on line 1: UNIQUE constraint failed: genres.idWelche Spalte sollte der Primärschlüssel sein? Meist eine Spalte id mit einer Zahl und sonst nichts. Ein Name oder eine E-Mail-Adresse sieht vielleicht auch eindeutig aus, aber Leute ändern ihre E-Mail-Adressen, und zwei Kunden können denselben Namen haben. Eine Zahl, die sich nie ändert, ist das Sicherste, worauf andere Tabellen zeigen können.
Andere Datenbanken erzeugen automatische IDs auf ihre eigene Art, zum Beispiel id SERIAL in PostgreSQL oder id INT AUTO_INCREMENT in MySQL. In SQLite begegnet dir vielleicht auch INTEGER PRIMARY KEY AUTOINCREMENT: Es stellt sicher, dass die Nummer einer gelöschten Zeile nie wieder verwendet wird, was du selten brauchst. Und ein Primärschlüssel kann auch aus mehreren Spalten bestehen, wie der von positionen. Einen solchen erstellst du später in dieser Lektion.
Typischer Fehler: INT PRIMARY KEY statt INTEGER PRIMARY KEY. Anderswo bedeuten INT und INTEGER dasselbe, aber nur INTEGER PRIMARY KEY lässt SQLite die Zeilen nummerieren. Mit INT bleibt die ID leer, wenn der INSERT sie weglässt, und ein Primärschlüssel darf nicht leer sein:
CREATE TABLE genres (
id INT PRIMARY KEY,
name TEXT
) STRICT;
INSERT INTO genres (name)
VALUES ('RPG');Error on line 6: NOT NULL constraint failed: genres.idSo schreibst du es:
Anweisungen
- 1
Erstelle eine
STRICT-Tabelleverlagefür die Firmen, die Spiele herstellen, mit drei Spalten:id, ein Ganzzahl-Primärschlüssel, dannnameundland, beide Text. - 2
Füge drei Verlage ohne ihre IDs ein und lass SQLite sie nummerieren (Name, Land):
'Northwind Games', 'USA''Blue Fox Studio', 'Kanada''Pixel Forge', 'UK'
Zeige dann die ganze Tabelle, sortiert nach
id:id name land 1 Northwind Games USA 2 Blue Fox Studio Kanada 3 Pixel Forge UK - 3
Füge vor der Abfrage einen Verlag mit der ID 20 hinzu,
'Sakura Soft', 'Japan', und danach noch einen ohne ID,'Red Panda Games', 'Polen'. Welche ID bekommt er? Führe die Datei aus und prüfe es:id name land 1 Northwind Games USA 2 Blue Fox Studio Kanada 3 Pixel Forge UK 20 Sakura Soft Japan 21 Red Panda Games Polen