INSERT
CREATE TABLE nutzer (id INTEGER PRIMARY KEY, name TEXT NOT NULL, ort TEXT, punkte INTEGER DEFAULT 0);
INSERT INTO nutzer (name, ort) VALUES ('Mia', 'Berlin');
INSERT INTO nutzer (name, ort, punkte) VALUES ('Tom', 'Hamburg', 50), ('Zoe', NULL, 80);
INSERT INTO nutzer (id, name) VALUES (10, 'Ben');
SELECT * FROM nutzer;id name ort punkte -- ---- ------- ------ 1 Mia Berlin 0 2 Tom Hamburg 50 3 Zoe 80 10 Ben 0
Gib die Spalten immer explizit an: Der Code bleibt gültig, wenn später Spalten hinzukommen. Fehlende Spalten bekommen den DEFAULT oder NULL.
Aus einer anderen Abfrage einfügen
CREATE TABLE a (n INTEGER);
CREATE TABLE b (n INTEGER);
INSERT INTO a VALUES (1), (2), (3), (4);
INSERT INTO b SELECT n * 10 FROM a WHERE n > 2;
SELECT * FROM b;n -- 30 40
Konflikte behandeln (Upsert)
CREATE TABLE zaehler (wort TEXT PRIMARY KEY, anzahl INTEGER);
INSERT INTO zaehler VALUES ('a', 1);
INSERT INTO zaehler VALUES ('a', 1)
ON CONFLICT(wort) DO UPDATE SET anzahl = anzahl + 1;
INSERT OR IGNORE INTO zaehler VALUES ('a', 99);
INSERT INTO zaehler VALUES ('b', 1)
ON CONFLICT(wort) DO UPDATE SET anzahl = anzahl + 1;
SELECT * FROM zaehler ORDER BY wort;wort anzahl ---- ------ a 2 b 1
ON CONFLICT ... DO UPDATE heißt in PostgreSQL gleich, in MySQL ON DUPLICATE KEY UPDATE.
UPDATE
CREATE TABLE konto (id INTEGER PRIMARY KEY, inhaber TEXT, stand REAL);
INSERT INTO konto VALUES (1,'Mia',100),(2,'Tom',50),(3,'Zoe',0);
UPDATE konto SET stand = stand + 25 WHERE id = 1;
UPDATE konto SET inhaber = 'Thomas', stand = 60 WHERE inhaber = 'Tom';
UPDATE konto SET stand = stand * 1.1 WHERE stand > 50;
SELECT * FROM konto;id inhaber stand -- ------- ----- 1 Mia 137.5 2 Thomas 66.0 3 Zoe 0.0
DELETE
CREATE TABLE logs (id INTEGER PRIMARY KEY, stufe TEXT, text TEXT);
INSERT INTO logs (stufe, text) VALUES ('info','a'),('fehler','b'),('info','c'),('debug','d');
DELETE FROM logs WHERE stufe = 'debug';
SELECT changes() AS geloescht;
DELETE FROM logs WHERE stufe IN ('info');
SELECT * FROM logs;geloescht --------- 1 id stufe text -- ------ ---- 2 fehler b
DELETE FROM tabelle; leert die Tabelle (Struktur bleibt). TRUNCATE TABLE ist die schnelle Variante in PostgreSQL/MySQL (SQLite kennt es nicht).
RETURNING
Neuere SQLite- und PostgreSQL-Versionen liefern geänderte Zeilen direkt zurück:
CREATE TABLE t (id INTEGER PRIMARY KEY, name TEXT);
INSERT INTO t (name) VALUES ('x'), ('y') RETURNING id, name;
UPDATE t SET name = upper(name) WHERE id = 2 RETURNING *;id name -- ---- 1 x 2 y id name -- ---- 2 Y
Merke
INSERT INTO t (spalten) VALUES (...)mit expliziten SpaltenUPDATE ... SET ... WHEREundDELETE ... WHERE: immer anWHEREdenken- Upsert:
ON CONFLICT DO UPDATE(MySQL:ON DUPLICATE KEY UPDATE) RETURNINGliefert betroffene Zeilen zurück- Mehrere Zeilen mit einem
INSERTsind schneller als viele einzelne
Aufgabe
Lege eine Tabelle mit fünf Produkten an, erhöhe alle Preise unter 10 um 10 % und lösche das teuerste Produkt.