Plötzlich kostete alles null Euro
Ein junger Entwickler wollte den Preis eines einzigen Artikels ändern. Er vergaß ein kurzes Wort.
Danach stand jeder Artikel der Tabelle auf 0 Euro, und der Shop verschenkte Ware bis zum Mittag.
Daten zu ändern ist leicht. Die Kunst ist, nur die Daten zu ändern, die man meint.
Am Ende dieser Lektion
Notiz
Ich kann Zeilen sicher hinzufügen, ändern und löschen.
Schlüsselwörter
| Begriff | Was er bedeutet |
|---|---|
| INSERT | fügt einer Tabelle neue Zeilen hinzu |
| UPDATE | ändert Werte in Zeilen, die schon da sind |
| DELETE | entfernt Zeilen aus einer Tabelle |
| Transaktion | eine Gruppe von Änderungen, die alle gelten oder keine |
| Commit | macht die Änderungen einer Transaktion dauerhaft |
| Rollback | macht die Änderungen einer Transaktion rückgängig |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Arbeiten Sie an einer Kopie, nie am Shop
In dieser Lektion ändern Sie Daten. Der Shop soll bleiben, wie er ist. Darum machen Sie zuerst eine Kopie.
Diese Runs melden sich an, legen Ihre eigene Datenbank student_depot an und kopieren die vier Gartenartikel in eine Tabelle regal.
Sie können sie jederzeit noch einmal starten, um von vorn zu beginnen.
Das Zertifikat des Servers annehmen
printf '[client]\nssl-verify-server-cert=0\n' > ~/.my.cnfHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Eine Abkürzung für den Client
alias db='mariadb -h db -u student -pstudent -t -e'Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Eine eigene Datenbank anlegen
db "CREATE DATABASE IF NOT EXISTS student_depot"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Eine alte Kopie wegwerfen
db "DROP TABLE IF EXISTS student_depot.regal"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Die Gartenartikel kopieren
db "CREATE TABLE student_depot.regal AS SELECT id, name, price, stock FROM shop.products WHERE category_id = 3"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
INSERT fügt eine Zeile hinzu
INSERT INTO nennt die Tabelle und ihre Spalten. VALUES gibt für jede neue Zeile eine Klammer mit Werten an.
Geben Sie die Werte in der Reihenfolge der Spalten an. Eine Spalte, die Sie weglassen, erhält ihren Standardwert oder NULL.
Verletzt eine Zeile eine Schlüsselregel, lehnt die Datenbank sie ab, wie in der ersten Lektion.
Ein Paar Gartenhandschuhe eintragen
db "INSERT INTO student_depot.regal (id, name, price, stock) VALUES (100, 'Gartenhandschuhe', 6.50, 25)"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
UPDATE ändert Zeilen, WHERE wählt sie aus
UPDATE nennt die Tabelle. SET gibt den neuen Wert. WHERE wählt die Zeilen.
Ohne WHERE ändert sich jede Zeile.
Die sichere Gewohnheit hat drei Schritte. Schreiben Sie ein SELECT mit demselben WHERE. Prüfen Sie, ob es die gemeinten Zeilen zeigt. Machen Sie dann aus SELECT ein UPDATE.
Schritt 1: erst die Zeilen ansehen
db "SELECT id, name, stock FROM student_depot.regal WHERE stock < 15 ORDER BY id"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Schritt 2: genau diese Zeilen ändern
db "UPDATE student_depot.regal SET stock = stock + 10 WHERE stock < 15"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Schritt 3: noch einmal ansehen
db "SELECT id, name, stock FROM student_depot.regal ORDER BY id"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
DELETE entfernt Zeilen endgültig
DELETE FROM entfernt die Zeilen, die zu seinem WHERE passen. Ohne WHERE leert es die ganze Tabelle.
Es gibt keinen Papierkorb. Dieselben drei Schritte gelten: erst SELECT, dann DELETE, dann wieder SELECT.
Die Handschuhe wieder entfernen
db "DELETE FROM student_depot.regal WHERE id = 100"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Ein häufiger Fehler
Warnung
Viele glauben, ein UPDATE oder DELETE treffe nur die Zeile, an die sie denken. Es trifft jede Zeile, die passt, und ohne WHERE sind das alle. Schreiben Sie zuerst das WHERE und prüfen Sie es mit einem SELECT.
Der Fehler, nur an der Kopie
db "UPDATE student_depot.regal SET stock = 0"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Ansehen, was er angerichtet hat
db "SELECT id, name, stock FROM student_depot.regal ORDER BY id"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Eine Transaktion gilt ganz oder gar nicht
50 Euro von einem Konto auf ein anderes zu buchen sind zwei Änderungen. Fällt der Rechner dazwischen aus, sind 50 Euro verschwunden.
Eine Transaktion fasst die Änderungen zusammen. COMMIT macht alle dauerhaft. ROLLBACK macht alle rückgängig.
Bis zum Commit sieht niemand sonst die Änderungen. Der nächste Run zeigt ein Rollback: Er löscht jede Zeile Ihrer Kopie, nimmt das zurück und zählt dann die Zeilen.
Alles löschen und zurücknehmen
db "START TRANSACTION; DELETE FROM student_depot.regal; ROLLBACK; SELECT COUNT(*) AS noch_da FROM student_depot.regal"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Ein Beispiel: ein Absturz in der Mitte
| Schritt | Konto 1 | Konto 2 | Ohne Transaktion | Mit Transaktion |
|---|---|---|---|---|
| Beginn | 200 € | 100 € | In Ordnung | In Ordnung |
| Nach der ersten Änderung | 150 € | 100 € | 50 € fehlen | Noch nicht dauerhaft |
| Absturz | 150 € | 100 € | Bleibt falsch | Zurück auf 200 € und 100 € |
| Beide Änderungen und COMMIT | 150 € | 150 € | In Ordnung | In Ordnung |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Den Standardmodus ansehen
db "SELECT @@autocommit AS autocommit"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Warum die Antwort 1 ist
Notiz
Normalerweise ist jede Anweisung eine winzige Transaktion, die sofort gilt. Darum lässt sich ein einzelnes UPDATE nicht zurücknehmen. Für ein Rollback müssen Sie in einer Sitzung zuerst START TRANSACTION schreiben.