INSERT
Nennen Sie die Spalten und geben Sie je einen Wert an. Weggelassene Spalten bekommen ihren Standardwert – added_at steht hier standardmäßig auf dem aktuellen Zeitstempel.
1
INSERT INTO wishlists (customer_id, product_id)
VALUES (1, 288);
1 Zeile geändert
Öffnet Planche in einem eigenen Browser-Tab, mit geladener Beispieldatenbank und dieser Abfrage im Editor. Alle Beispiele der Seite verwenden denselben Tab weiter, und ausgeführt wird erst, wenn Sie F9 drücken.
Eine Zeile geändert. Die Spalten ausdrücklich zu nennen, statt sich auf die Spaltenreihenfolge der Tabelle zu verlassen, sorgt dafür, dass die Anweisung auch dann noch funktioniert, wenn jemand eine Spalte hinzufügt.
Was die Datenbank ablehnt
Führen Sie exakt dieselbe Anweisung noch einmal aus.
2
-- The same statement a second time. (customer_id, product_id) is the
-- primary key of wishlists, so the database refuses the duplicate.
INSERT INTO wishlists (customer_id, product_id)
VALUES (1, 288);
Fehler
Ein Fehler, und nichts hat sich geändert. wishlists hat PRIMARY KEY (customer_id, product_id), dasselbe Paar kann also nicht zweimal existieren – die Bedingung hat es abgelehnt. Constraints sind keine Hindernisse, die man umgeht; sie verhindern, dass ein Fehler in Ihrer Anwendung zu dauerhaft falschen Daten wird.
UPDATE und die Klausel, auf die es ankommt
3
UPDATE customers
SET loyalty_points = loyalty_points + 100
WHERE id = 1;
1 Zeile geändert
Zwei Gewohnheiten machen das deutlich unwahrscheinlicher. Die erste: die WHERE-Klausel vor der SET-Klausel schreiben. Die zweite: sie erst als SELECT ausführen – dasselbe FROM, dasselbe WHERE – und ansehen, was zurückkommt, bevor etwas geändert wird.
Das Zweite kann Planche für Sie übernehmen. Schalten Sie Einstellungen › Sicherheit › Betroffene Zeilen vorab anzeigen ein, und ein UPDATE oder DELETE wird in das passende SELECT umgeschrieben, gezählt und Ihnen vor der Ausführung gezeigt. Eine schreibgeschützte Verbindung und eine Farbe je Verbindung für die Produktion finden Sie an derselben Stelle.
4
SELECT id, first_name, last_name, loyalty_points
FROM customers
WHERE id = 1;
Ergebnis — 1 Zeile
| id | first_name | last_name | loyalty_points |
|---|---|---|---|
| 1 | Liam | Fischer | 3619 |
DELETE
5
DELETE FROM wishlists
WHERE customer_id = 1
AND product_id = 288;
1 Zeile geändert
Die Zeilen mit einer Unterabfrage auswählen
Die WHERE-Klausel eines UPDATE oder DELETE ist eine gewöhnliche WHERE-Klausel, alles aus der Lektion zu Unterabfragen funktioniert hier also. Über eine Unterabfrage ändern Sie Zeilen einer Tabelle anhand dessen, was in einer anderen steht.
6
-- Which rows to change is its own question, and a subquery can answer it.
UPDATE customers
SET loyalty_points = loyalty_points + 50
WHERE id IN (
SELECT customer_id
FROM orders
WHERE status = 'refunded'
AND total > 2000
);
242 Zeilen geändert
242 Kunden hatten eine erstattete Bestellung über 2.000, und diese 242 Zeilen haben sich geändert. Die Gewohnheit von vorhin gilt genauso: Führen Sie es zuerst als SELECT id FROM customers WHERE id IN (...) aus und zählen Sie die Zeilen, denn in der Unterabfrage steckt der Fehler.
7
DELETE FROM wishlists
WHERE product_id IN (
SELECT id FROM products WHERE stock_quantity = 0
);
260 Zeilen geändert
NOT EXISTS und EXISTS funktionieren hier ebenfalls und sind für den verneinten Fall aus dem in der Unterabfragen-Lektion genannten Grund die sicherere Wahl. Nicht portabel ist dagegen, direkt in einem UPDATE oder DELETE zu joinen – jede Engine schreibt das anders, und eine kann es gar nicht. Die Dialektseite dazu behandelt alle fünf.
Transaktionen
Eine Transaktion gruppiert Anweisungen so, dass alle oder keine passieren – und lässt Sie bis zum Bestätigen das Ergebnis ansehen und es sich anders überlegen.
8
BEGIN;
UPDATE coupons
SET used_count = used_count + 1
WHERE code = 'WELCOME10';
SELECT code, used_count FROM coupons WHERE code = 'WELCOME10';
ROLLBACK;
Ergebnis — 1 Zeile
| code | used_count |
|---|---|
| WELCOME10 | 63 |
BEGIN öffnet sie, das SELECT zeigt den Gutschein bereits erhöht, und ROLLBACK setzt es zurück. Tauschen Sie ROLLBACK gegen COMMIT, und die Änderung wird stattdessen dauerhaft. Überzeugen Sie sich selbst, dass die Anzahl unverändert ist:
9
SELECT code, used_count FROM coupons WHERE code = 'WELCOME10';
Ergebnis — 1 Zeile
| code | used_count |
|---|---|
| WELCOME10 | 62 |
Für eine riskante Änderung an einer echten Datenbank ist das das richtige Werkzeug: Transaktion öffnen, Anweisung ausführen, prüfen, ob die Zeilenzahl den Erwartungen entspricht, und erst dann bestätigen. Planche hat das als Modus – Verbindung › Manuelle Transaktionen hält eine Transaktion offen und legt Commit und Rollback in die Werkzeugleiste, sodass jede ausgeführte Anweisung vorläufig bleibt, bis Sie sich festlegen.
Was Sie jetzt können
Alles, außer herauszufinden, warum eine Abfrage langsam ist – und das ist die letzte Lektion.