Zum Inhalt
wannacode

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:

SQLleere Datenbank

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

  • PKidinteger
  • nametext
  • citytext
  • phonetext
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).

SQLleere Datenbank

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:

SQLleere Datenbank

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:

SQLleere Datenbank

Jetzt kommt „zwölf“ nicht hinein. Text, der eine Zahl ist, wird weiter angenommen und umgewandelt:

SQLleere Datenbank
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.

SQLleere Datenbank

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.
  • DATE und TIMESTAMP: ein Datum und ein Datum mit Uhrzeit.
  • BOOLEAN: wahr oder falsch.

SQLite akzeptiert diese Namen, setzt sie aber nicht durch:

SQLleere Datenbank

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.

SQLDatenbank: Shop

Test

Teste dich

1. Welcher Typ passt zu einem Preis wie 2,50 €?
2. Die Tabelle ist nicht STRICT, und die Spalte counted ist INTEGER. Was passiert, wenn du den Text „zwölf“ einfügst?
3. Wie werden Daten in SQLite gespeichert?
4. Was macht STRICT am Ende von CREATE TABLE?

Erstellt von Ivo Gergov im Rahmen der Kampagne von Evo Tech für zugängliche Programmierausbildung ·