Lektionen des Moduls (3/4)
Erstellen von Tabellen und Constraints: DDL
Bisher haben Sie an Tabellen gearbeitet, die bereits existieren (customers,
orders…). DDL („Data Definition Language“) bezieht sich auf die Aussagen, die
Erstellen und Ändern des Schemas selbst: Tabellen, Spalten, Einschränkungen,
Indizes.
CREATE TABLE: die Syntax
CREATE TABLE nome_tabella (
colonna TIPO [vincoli_colonna],
…,
[vincoli_tabella]
);Beispiel: eine Wunschliste, die Kunden und Produkte verknüpft:
CREATE TABLE wishlists (
id SERIAL PRIMARY KEY,
customer_id INTEGER NOT NULL REFERENCES customers(id),
product_id INTEGER NOT NULL REFERENCES products(id),
added_on DATE NOT NULL DEFAULT CURRENT_DATE,
note TEXT,
UNIQUE (customer_id, product_id)
);Lassen Sie es uns Stück für Stück aufschlüsseln.
Die häufigsten Typen
| Geben Sie | ein Was es enthält |
|---|---|
INTEGER / INT | Ganze Zahlen (-2,1B … +2,1B) |
BIGINT | Große ganze Zahlen |
NUMERIC(p, s) | Exakte Dezimalzahlen – Geld, Prozentsätze |
TEXT | Zeichenfolgen variabler Länge |
VARCHAR(n) | Zeichenfolgen mit einer maximalen Länge von n |
BOOLEAN | TRUE / FALSE / INT0 |
INT1 | Nur Datum |
INT2 | Datum + Uhrzeit (keine Zeitzone) |
INT3 | Datum + Uhrzeit mit Zeitzone |
INT4 | INT5 mit automatisch inkrementierender Sequenz |
Einschränkungen
Eine Einschränkung ist eine Regel, die PostgreSQL automatisch durchsetzt: wenn eine
INSERT/UPDATE verstößt dagegen, der Vorgang schlägt fehl.
PRIMARY KEY -- identifica univocamente la riga, non NULL
NOT NULL -- vieta NULL
UNIQUE -- vieta duplicati su questa colonna
REFERENCES tabella(colonna) -- foreign key
CHECK (espressione_booleana) -- es. CHECK (price > 0)
DEFAULT espressione -- valore di default se non fornitoEinschränkungen können inline auf einer Spalte oder auf Tabellenebene deklariert werden
Einschränkungen (unterhalb der Felder). Beispiel für einen zusammengesetzten UNIQUE:
UNIQUE (customer_id, product_id) -- niente coppia (cliente, prodotto) duplicataCHECK-Einschränkung
CHECK erzwingt eine benutzerdefinierte Regel:
CREATE TABLE stock_alerts (
product_id INTEGER PRIMARY KEY REFERENCES products(id),
threshold INTEGER NOT NULL CHECK (threshold >= 0),
notify_email TEXT NOT NULL,
active BOOLEAN NOT NULL DEFAULT true
);threshold muss ≥ 0 sein; Wenn jemand INSERT … threshold = -5 ausprobiert, ist es
schlägt mit einem Einschränkungsfehler fehl.
Löschen und Ändern
DROP TABLE wishlists; -- elimina la tabella (e i dati!)
DROP TABLE IF EXISTS wishlists; -- senza errore se non esiste
ALTER TABLE customers ADD COLUMN newsletter BOOLEAN NOT NULL DEFAULT false;
ALTER TABLE customers DROP COLUMN newsletter;Du bist dran
Erstellen Sie eine Wunschlistentabelle mit den folgenden Spalten: id (SERIELLER PRIMÄRSCHLÜSSEL), customer_id (INTEGER NOT NULL REFERENCES customer(id)), product_id (INTEGER NOT NULL REFERENCES products(id)), Added_on (DATE NOT NULL with DEFAULT CURRENT_DATE). Fügen Sie eine UNIQUE-Einschränkung für das Paar hinzu (customer_id, product_id).
Hinweis anzeigen
UNIQUE (customer_id, product_id) als Einschränkung auf Tabellenebene unten.
Lösung nach 3 Versuchen verfügbar
Wiederholungsübung
Fügen Sie der Kundentabelle eine Newsletter-Spalte vom Typ BOOLEAN, NOT NULL, mit DEFAULT false hinzu. Verwenden Sie eine einzelne ALTER TABLE-Anweisung.
Hinweis anzeigen
Ohne DEFAULT würde ALTER fehlschlagen, da bereits Zeilen vorhanden sind und die neue Spalte NICHT NULL ist.
Lösung nach 3 Versuchen verfügbar