Direkt zum Hauptinhalt springen
eLearner.app
Modul 9 · Lektion 1 von 433/57 im Kurs~10 min
Lektionen des Moduls (1/4)

Fortgeschrittene Datentypen und ENUMs

In der vorherigen Lektion haben wir den grundlegenden CREATE TABLE-Befehl gesehen. Lassen Sie uns nun einige erweiterte Datentypen erkunden, die PostgreSQL bietet, um unsere Domänen präziser und sicherer zu modellieren.

Numerische und Texttypen

PostgreSQL verfügt über mehrere Typen für Zahlen und Text. Die richtige Auswahl hilft sowohl bei der Validierung als auch beim Speicherplatz.

SQL
CREATE TABLE advanced_products (
  id           SERIAL PRIMARY KEY,
  name         VARCHAR(50) NOT NULL,
  description  TEXT,
  -- NUMERIC(p,s) dove p = cifre totali, s = cifre decimali
  price        NUMERIC(10, 2) NOT NULL,
  featured     BOOLEAN DEFAULT FALSE
);
  • TEXT vs. VARCHAR(n): In Postgres ist die Leistung identisch. Sie verwenden VARCHAR(n) nur, wenn Sie die eingefügte Länge auf Datenbankebene explizit begrenzen möchten.
  • NUMERIC(10, 2): Perfekt für Geld oder arithmetische Präzision. Hier sind höchstens 8 Ganzzahlen und 2 Dezimalstellen (insgesamt 10) zulässig. Wenn Sie 10.555 einfügen, rundet Postgres es auf 10.56.

Der UUID-Typ

Für sichere Identifikatoren, die im Web offengelegt werden (z. B. öffentliche IDs in URLs), wird UUID häufig dem klassischen SERIAL-Inkrement vorgezogen.

SQL
CREATE TABLE public_orders (
  id          UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  customer    TEXT NOT NULL,
  total       NUMERIC(10, 2)
);

ENUM (Aufzählungen)

Oftmals darf eine Spalte nur einen von wenigen vordefinierten Werten enthalten (z. B. Bestellstatus: „neu“, „bezahlt“, „versendet“). Ein Ansatz besteht darin, das Schlüsselwort CHECK zu verwenden, PostgreSQL bietet jedoch benutzerdefinierte ENUM-Typen.

SQL
-- Dobbiamo prima creare il tipo:
CREATE TYPE order_status AS ENUM ('nuovo', 'pagato', 'spedito', 'cancellato');

-- Ora possiamo usarlo in una tabella:
CREATE TABLE orders_demo (
  id SERIAL PRIMARY KEY,
  status order_status NOT NULL DEFAULT 'nuovo'
);

Dadurch wird gewährleistet, dass niemand jemals einen ungültigen Status einfügen kann, was die Datenkonsistenz gewährleistet.

Probieren Sie es aus

Übung#sql.m9.l1.e1
Versuche: 0Wird geladen…

Erstellen Sie eine „user_reviews“-Tabelle mit: ID (SERIAL pk), test_id (UUID mit Standard gen_random_uuid()), Punktzahl (Ganzzahl nicht Null) und Inhalt (TEXT). Keines der anderen Felder benötigt über den Typ hinausgehende explizite Einschränkungen.

Editor wird geladen…
Hinweis anzeigen

Schreiben Sie CREATE TABLE user_reviews (...) und dann die verschiedenen Felder. Denken Sie an die Kommas.

Lösung nach 3 Versuchen verfügbar

Wiederholungsübung

Übung#sql.m9.l1.e2
Versuche: 0Wird geladen…

Erstellen Sie zunächst den ENUM-Typ „user_role“ mit den Werten „admin“ und „user“. Erstellen Sie dann die Tabelle „enum_users“ mit der ID (SERIAL pk) und der Rolle (der Typ, den Sie gerade erstellt haben, NICHT NULL).

Editor wird geladen…
Hinweis anzeigen

Vergessen Sie nicht das ; um die beiden Anweisungen (CREATE TYPE und CREATE TABLE) zu trennen.

Lösung nach 3 Versuchen verfügbar