Tabellen anlegen
CREATE TABLE produkte (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
preis REAL NOT NULL CHECK (preis >= 0),
lager INTEGER DEFAULT 0,
aktiv INTEGER DEFAULT 1
);
INSERT INTO produkte (name, preis) VALUES ('Stift', 1.5);
SELECT * FROM produkte;id name preis lager aktiv -- ----- ----- ----- ----- 1 Stift 1.5 0 1
Datentypen
Die Namen unterscheiden sich je nach System. Gängige Typen:
| Zweck | Standard / PostgreSQL | MySQL | SQLite |
|---|---|---|---|
| Ganzzahl | INTEGER, BIGINT, SMALLINT | INT, BIGINT | INTEGER |
| Dezimal exakt | NUMERIC(10,2) | DECIMAL(10,2) | NUMERIC |
| Gleitkomma | REAL, DOUBLE PRECISION | FLOAT, DOUBLE | REAL |
| Text | VARCHAR(n), TEXT | VARCHAR(n), TEXT | TEXT |
| Wahrheitswert | BOOLEAN | BOOLEAN (= TINYINT) | INTEGER (0/1) |
| Datum/Zeit | DATE, TIMESTAMP | DATE, DATETIME | TEXT (ISO-Format) |
| Binär | BYTEA | BLOB | BLOB |
SQLite ist besonders: Es hat dynamische Typisierung (der Wert bestimmt den Typ). Mit typeof() siehst du ihn:
SELECT typeof(42) AS a, typeof(3.14) AS b, typeof('x') AS c, typeof(NULL) AS d, typeof(x'ff') AS e;
SELECT 0.1 + 0.2 AS summe, 0.1 + 0.2 = 0.3 AS gleich;a b c d e ------- ---- ---- ---- ---- integer real text null blob summe gleich ----- ------ 0.3 0
Einschränkungen (Constraints)
| Constraint | Wirkung |
|---|---|
PRIMARY KEY | eindeutiger Schlüssel der Zeile |
NOT NULL | Wert ist Pflicht |
UNIQUE | keine Duplikate |
DEFAULT x | Standardwert, wenn nichts angegeben |
CHECK (bedingung) | beliebige Regel |
FOREIGN KEY | Verweis auf andere Tabelle (später) |
CREATE TABLE konto (
iban TEXT PRIMARY KEY,
inhaber TEXT NOT NULL,
stand REAL NOT NULL DEFAULT 0 CHECK (stand >= -500),
email TEXT UNIQUE
);
INSERT INTO konto (iban, inhaber, email) VALUES ('DE01', 'Mia', 'mia@x.de');
SELECT * FROM konto;iban inhaber stand email ---- ------- ----- -------- DE01 Mia 0.0 mia@x.de
Verstößt ein Befehl gegen eine Regel, bricht die Datenbank ihn ab:
CREATE TABLE konto (iban TEXT PRIMARY KEY, stand REAL NOT NULL CHECK (stand >= 0));
INSERT INTO konto VALUES ('DE01', 10);
INSERT INTO konto VALUES ('DE01', 20);Runtime error near line 3: UNIQUE constraint failed: konto.iban (19)
Tabellen ändern und löschen
CREATE TABLE t (id INTEGER PRIMARY KEY, name TEXT);
ALTER TABLE t ADD COLUMN notiz TEXT;
ALTER TABLE t RENAME COLUMN notiz TO bemerkung;
ALTER TABLE t RENAME TO tabelle;
INSERT INTO tabelle (name) VALUES ('x');
SELECT * FROM tabelle;
DROP TABLE tabelle;
DROP TABLE IF EXISTS gibt_es_nicht;
SELECT count(*) AS tabellen FROM sqlite_master WHERE type = 'table';id name bemerkung -- ---- --------- 1 x tabellen -------- 0
Auto-Inkrement
INTEGER PRIMARY KEY zählt in SQLite automatisch hoch. In anderen Systemen: PostgreSQL GENERATED ALWAYS AS IDENTITY (oder SERIAL), MySQL AUTO_INCREMENT.
CREATE TABLE gaeste (id INTEGER PRIMARY KEY, name TEXT);
INSERT INTO gaeste (name) VALUES ('A'), ('B'), ('C');
SELECT * FROM gaeste;
SELECT last_insert_rowid() AS letzte_id;id name -- ---- 1 A 2 B 3 C letzte_id --------- 3
Merke
CREATE TABLElegt Struktur an,ALTER TABLEändert sie,DROP TABLElöscht sie- Wichtige Typen: Ganzzahl, Dezimal, Text, Datum, Wahrheitswert (Namen variieren)
- Constraints (
NOT NULL,UNIQUE,CHECK,DEFAULT) sichern Datenqualität - Geld nie als Gleitkommazahl speichern
- Jede Tabelle braucht einen Primärschlüssel
Aufgabe
Lege eine Tabelle buecher mit Primärschlüssel, Pflichttitel, Seitenzahl (nur positiv) und Erscheinungsjahr an.