CREATE TABLE: eine Tabelle anlegen
Kurz gesagt: CREATE TABLE legt eine Tabelle mit Spalten und Typen an; in SQLite sind die Typen nur ein Wunsch, STRICT macht sie zu Regeln.
Problem
Das Notizbuch der Lieferanten
Das Brot kommt von einer Bäckerei, die Milch von einer Molkerei, die Reinigungsmittel von einem Großhandelslager. Ihre Telefonnummern stehen in einem Notizbuch neben der Kasse. Geht das Notizbuch verloren, weiß keiner, wen er anrufen soll.
Sie gehören in die Datenbank. Bisher waren die Tabellen fertig. Diese machst du selbst.
Die Idee
CREATE TABLE
CREATE TABLE legt eine neue Tabelle an: einen Namen und in Klammern die Spalten, jede mit einem Typ. Die Datenbank hier ist leer:
Die Spalte id INTEGER PRIMARY KEY ist der Primärschlüssel. In SQLite bekommt so eine Spalte die nächste Nummer von selbst, deshalb steht sie nicht im INSERT. Spalten werden durch Kommas getrennt, nach der letzten steht kein Komma.
Hier ist die neue Tabelle:
suppliers
- PK
idinteger nametextcitytextphonetext
Genauer, für Neugierige
Eine Tabelle, die es schon gibt, lässt sich nicht ein zweites Mal anlegen: SQLite bricht mit „table suppliers already exists“ ab. CREATE TABLE IF NOT EXISTS suppliers (…) legt sie nur an, wenn es sie nicht gibt. Das ist praktisch in einem Skript, das mehr als einmal läuft.
Die Idee
Die Typen
Der Typ sagt, welche Werte die Spalte aufnimmt. SQLite hat fünf:
INTEGER: eine ganze Zahl. Bestand, eine Anzahl, eine Nummer.REAL: eine Kommazahl. Ein Preis, ein Gewicht.TEXT: Text. Ein Name, eine Stadt, eine Telefonnummer.BLOB: Bytes, wie sie sind. Ein Foto, eine Datei.NUMERIC: eine Zahl, die SQLite als ganze Zahl speichert, wenn es geht, sonst als Kommazahl.
Für Daten gibt es keinen eigenen Typ. Die Daten im Shop sind Text in der Form '2026-10-25': So sortieren sie richtig. Auch eine Telefonnummer ist Text, obwohl sie aus Ziffern besteht: Du rechnest nicht damit, und eine führende Null muss bleiben.
Genauer, für Neugierige
REAL ist eine Gleitkommazahl. Die meisten Kommazahlen speichert sie ungefähr, nicht exakt, und kleine Fehler summieren sich über viele Berechnungen. Deshalb speichern echte Projekte Geld oft in Cent als INTEGER (250 statt 2,50) oder mit dem Typ NUMERIC(10,2) in PostgreSQL und MySQL. Im Shop sind die Preise REAL, damit sie sich lesen wie auf einem Kassenbon.
Probier es aus
Die Lieferungen
Lege eine Tabelle deliveries für die Lieferungen an: id (Primärschlüssel), supplier_id (die Nummer des Lieferanten, eine ganze Zahl), delivered_at (das Datum) und amount (die Summe in Euro, eine Dezimalzahl wie die Preise im Shop).
Lösung
CREATE TABLE deliveries (
id INTEGER PRIMARY KEY,
supplier_id INTEGER,
delivered_at TEXT,
amount REAL
);id INTEGER PRIMARY KEY, supplier_id INTEGER, delivered_at TEXT, amount REAL. Das Datum ist Text, weil SQLite keinen Datumstyp hat. Der Betrag ist REAL, weil er Cent hat.
Sieh es dir an
Text in einer Zahlenspalte
Der Lagerist zählt die Produkte und schreibt auf, wie viele es sind. Eines Tages schreibt er „zwölf“ in Worten. Führ die Abfrage aus. typeof() sagt dir den Typ des Werts, der wirklich gespeichert wurde:
Beide Zeilen gehen hinein. '12' wird zur Zahl 12, weil die Spalte INTEGER ist und SQLite sie umwandeln kann. „zwölf“ kann keine Zahl werden und bleibt Text in der Zahlenspalte.
Das ist die Typaffinität (type affinity) von SQLite. Der Typ der Spalte ist eher eine Empfehlung: SQLite versucht, den Wert umzuwandeln, aber wenn es nicht geht, nimmt es ihn, wie er ist. Die Auswertung SUM(counted) zählt „zwölf“ dann stillschweigend als 0.
Die Idee
STRICT
Wenn du STRICT hinter die Klammern von CREATE TABLE schreibst, werden die Typen zu Regeln:
Jetzt kommt „zwölf“ nicht hinein. Text, der eine Zahl ist, wird weiter angenommen und umgewandelt:
Genauer, für Neugierige
In einer STRICT-Tabelle muss jede Spalte einen Typ haben, und er muss einer von INTEGER (oder INT), REAL, TEXT, BLOB und ANY sein. ANY nimmt alles, ohne umzuwandeln. NUMERIC ist dort nicht erlaubt. STRICT-Tabellen gibt es in SQLite seit Version 3.37 (2021). Der Kurs läuft auf SQLite 3.49.
Probier es aus
Die strenge Bestandszählung
Die Tabelle der Bestandszählung hat ein Produkt (product, Text), die gezählte Menge (counted, eine ganze Zahl) und ein Datum (counted_at). Sorge dafür, dass Wörter statt Zahlen nicht hineinkommen.
Lösung
CREATE TABLE stock_counts (
product TEXT,
counted INTEGER,
counted_at TEXT
) STRICT;Du ergänzt STRICT nach der schließenden Klammer: ) STRICT;. Die Spalten bleiben gleich.
Die Idee
In PostgreSQL und MySQL
Die großen Datenbanken haben mehr Typen. Du triffst sie in fast jedem Schema:
VARCHAR(50): Text mit bis zu 50 Zeichen.NUMERIC(10,2): eine exakte Zahl mit 2 Stellen nach dem Komma. Für Geld.DATEundTIMESTAMP: ein Datum und ein Datum mit Uhrzeit.BOOLEAN: wahr oder falsch.
SQLite akzeptiert diese Namen, setzt sie aber nicht durch:
Der Code ist länger als 5 Zeichen, „ja“ ist kein Boolean, „bis Weihnachten“ ist kein Datum. SQLite speichert sie als Text. PostgreSQL würde alle drei ablehnen. Wenn du ein Schema für eine andere Datenbank schreibst, nimm deren Typen. Wenn du es in SQLite ausprobierst, verlass dich nicht darauf, dass sie die Daten schützen.
Übung
Die Lieferanten im Shop
Lege neben den Tabellen des Shops suppliers mit id (Primärschlüssel), name und city an. Füge zwei Lieferanten hinzu: „Bäckerei Zora“ aus Sofia und „Balkan-Molkerei“ aus Smolyan.
Lösung
CREATE TABLE suppliers (
id INTEGER PRIMARY KEY,
name TEXT,
city TEXT
);
INSERT INTO suppliers (name, city) VALUES ('Bäckerei Zora', 'Sofia'), ('Balkan-Molkerei', 'Smolyan');CREATE TABLE suppliers (id INTEGER PRIMARY KEY, name TEXT, city TEXT); und dann ein INSERT mit zwei Zeilen. Die Nummern 1 und 2 kommen vom Primärschlüssel von selbst.
Test
Teste dich
Verwandte Lektionen
Abschnitt „Verwandte Lektionen“- Baut auf: SELECT: Spalten auswählen · Aggregatfunktionen: COUNT, SUM, AVG · Primärschlüssel und Fremdschlüssel · INSERT: Zeilen einfügen
- Geht weiter in: Constraints: Regeln für die Daten · Fremdschlüssel: Verbindungen zwischen Tabellen · ALTER TABLE: eine Tabelle ändern · Views
- Aufgaben zum Thema: Tabellen und Regeln