Zum Inhalt
wannacode

Die Bäckerei, Etappe 4: die Änderungen

Kurz gesagt: Etappe 4 ändert die Daten der Bäckerei mit UPDATE, DELETE und einem Upsert, und eine gelieferte Bestellung senkt den Lagerbestand innerhalb einer Transaktion.

Problem

Nichts bleibt, wie es ist

Das Mehl wurde teurer. Ana hat ihre Bestellung bezahlt. Desislavas Bestellung ist zu ihr unterwegs. Boris hat seine storniert. Eine Lieferung ist gekommen. All das heißt, bestehende Zeilen zu ändern: UPDATE, DELETE und ein Insert, das auch eine Änderung sein kann.

Jedes Feld beginnt mit der vollen Datenbank aus Etappe 2.

Die Idee

Erst SELECT

Die Teilchen werden 10 % teurer. Vor dem UPDATE führst du ein SELECT mit demselben WHERE und dem neuen Wert als Ausdruck aus. So siehst du, welche Zeilen sich ändern und wie:

SQLleere Datenbank

Drei Zeilen, nur die Teilchen. Jetzt kommt dasselbe WHERE in das UPDATE.

Probier es aus

Die Preiserhöhung

Erhöhe die Preise der Teilchen (Kategorie 2) um 10 %, auf 2 Stellen gerundet.

SQLleere Datenbank

Sieh es dir an

Die alte Rechnung

Der Preis des Croissants ist jetzt 1,43 €. Bestellung 1 behält aber den Preis, zu dem Ivan gekauft hat:

SQLleere Datenbank

Darum hat order_items in Etappe 1 das unit_price: Die Rechnung von letzter Woche ändert sich nicht.

Probier es aus

Bezahlt

Ana hat Bestellung 6 bezahlt. Ändere ihren Status auf 'paid'.

SQLleere Datenbank

Ein Tippfehler kommt nicht durch, denn das CHECK aus Etappe 1 bewacht die Status:

SQLleere Datenbank

Übung

Die Lieferung

Wird die Bestellung geliefert, verlassen die Produkte das Lager. Für jedes Produkt der Bestellung sinkt der Lagerbestand um die Stückzahl in der Zeile. Das ist ein UPDATE mit einer Unterabfrage, die für jedes Produkt die Stückzahl holt.

Bestellung 5 (Desislavas) wird geliefert. Senke in einer Transaktion den Lagerbestand jedes Produkts darin um die Stückzahl in der Zeile und ändere den Status der Bestellung auf 'delivered'.

SQLleere Datenbank
Genauer, für Neugierige

SQLite seit 3.33 und PostgreSQL haben auch UPDATE … FROM: UPDATE products SET stock = stock - i.quantity FROM order_items i WHERE i.order_id = 5 AND i.product_id = products.id;. Das Ergebnis ist dasselbe, und bei vielen Zeilen ist es schneller.

Sieh es dir an

Mehr, als da ist

Es gibt 10 Kozunaks. Jemand versucht, 20 zu verkaufen:

SQLleere Datenbank

CHECK (stock >= 0) aus Etappe 1 erlaubt es nicht, etwas zu verkaufen, das nicht da ist.

Die Idee

Löschen

Ein Produkt, das in Bestellungen vorkommt, lässt sich nicht löschen: Der Fremdschlüssel in order_items bewacht es.

SQLleere Datenbank

Ein Produkt, das nicht mehr verkauft wird, bleibt in der Datenbank. Es aus der Speisekarte zu nehmen ist eine andere Spalte (active) oder eine andere Kategorie, nicht DELETE.

Probier es aus

Die stornierte Bestellung

Die Bäckerei behält stornierte Bestellungen nicht. Lösche Bestellung 4 zusammen mit ihren Zeilen.

SQLleere Datenbank
Genauer, für Neugierige

Viele Systeme löschen Bestellungen gar nicht: Der Status 'cancelled' genügt, und die Geschichte bleibt für die Berichte und die Buchhaltung. Das nennt man Soft Delete. Hier ist es DELETE, damit du CASCADE bei der Arbeit siehst.

Probier es aus

Eine neue Lieferung

Eine Lieferung ist gekommen: 20 Croissants (Produkt 4, das es schon gibt) und ein neues Produkt, 25 Flaschen Boza (es wird Produkt 9, ein Getränk für 1,50 €). Ein und dasselbe INSERT muss das Neue hinzufügen und das Vorhandene erhöhen. Das ist ein Upsert: INSERT … ON CONFLICT (id) DO UPDATE.

Schreibe die Lieferung mit einem INSERT: (4, 'Croissant', 2, 1.30, 20) und (9, 'Boza', 3, 1.50, 25). Gibt es das Produkt schon, wächst sein Lagerbestand um das Gelieferte.

SQLleere Datenbank

Die Idee

Was als Nächstes kommt

Jede Änderung hier ist eine von Hand geschriebene Abfrage: Der Lagerbestand sinkt, wenn jemand daran denkt. Die nächste Etappe lässt die Datenbank das von selbst tun und macht sie schneller: ein Index, eine View, ein Trigger und eine neue Spalte.

Test

Teste dich

1. Was macht UPDATE products SET price = price * 1.1 ohne WHERE?
2. Das Croissant wurde teurer. Was passiert mit der Rechnung der Bestellung 1, in der Ivan drei Croissants genommen hat?
3. Eine Lieferung von 20 Croissants mit INSERT OR REPLACE statt ON CONFLICT … DO UPDATE. Was passiert mit dem Lagerbestand?

Erstellt von Ivo Gergov im Rahmen der Kampagne von Evo Tech für zugängliche Programmierausbildung ·