Zum Inhalt
wannacode

Die Bäckerei, Etappe 6: der Bericht, die Kopie und DROP

Kurz gesagt: Die letzte Etappe baut einen Bericht mit Fensterfunktionen, kopiert die Datenbank mit VACUUM INTO und entfernt alles mit DROP in der richtigen Reihenfolge.

Problem

Der Monat ist vorbei

Der Oktober ist vorbei. Die Bäckerei will einen Bericht: wie der Umsatz Tag für Tag wächst, wer der beste Kunde ist und welcher Anteil des Geldes von ihm kommt. Dann will sie eine Kopie der Datenbank, bevor eine neue Saison beginnt. Und du nimmst, um den ganzen Weg zu sehen, die Datenbank Stück für Stück auseinander, bis sie leer ist wie am Anfang von Etappe 1.

Die Felder beginnen mit der Datenbank nach Etappe 5: die Daten, der Index, die View order_totals, der Trigger take_stock und die Spalte phone.

Die Idee

Die laufende Summe

Eine Fensterfunktion berechnet einen Wert aus mehreren Zeilen, ohne sie zu einer zusammenzufassen. SUM(t.total) OVER (ORDER BY o.ordered_at) ist die Summe aller Bestellungen bis einschließlich dieser Zeile:

SQLleere Datenbank

So siehst du, wie der Monat auf 47 € wächst, ohne die stornierte Bestellung.

Probier es aus

Der Bericht

Ein Bericht pro Kunde, ohne die stornierten Bestellungen: der Name, der ausgegebene Betrag (spent), der Anteil am gesamten Umsatz in Prozent (share, auf 1 Stelle gerundet) und der Platz in der Rangliste (place, mit RANK). Sortiere nach Platz. Nimm die Summen aus der View order_totals.

SQLleere Datenbank
Genauer, für Neugierige

RANK gibt Gleichen denselben Platz und überspringt den nächsten (1, 1, 3). DENSE_RANK überspringt nicht (1, 1, 2), und ROW_NUMBER vergibt auch Gleichen verschiedene Nummern.

Die Idee

Die Kopie

Vor einer großen Änderung (eine neue Saison, eine Migration, ein Datenimport) machst du eine Kopie. VACUUM INTO schreibt die ganze Datenbank im laufenden Betrieb in eine neue Datei, und ATTACH öffnet die Kopie als zweite Datenbank neben der ersten:

SQLleere Datenbank

Die sechs Bestellungen und die fünf Tabellen sind auch in der Kopie.

Führst du das Feld ein zweites Mal aus, bricht VACUUM INTO ab: Die Datei gibt es schon. In der echten Arbeit ist es genauso: Jede Kopie ist eine neue Datei mit dem Datum im Namen.

Genauer, für Neugierige

In PostgreSQL wird die Kopie von außen gemacht: pg_dump bakery > bakery-2026-10-31.sql und mit psql wiederhergestellt. Eine Kopie, die niemand wiederherzustellen versucht hat, ist keine Kopie.

Sieh es dir an

Was wovon abhängt

Die View order_totals liest aus order_items. Geht die Tabelle zuerst:

SQLleere Datenbank

Die View bleibt, zeigt aber jetzt ins Leere. Die Indizes und Trigger einer Tabelle verschwinden mit ihr, Views nicht. Darum entfernt man die Views zuerst. PostgreSQL ist strenger: Dort bricht DROP TABLE ab, solange eine View aus der Tabelle liest.

Probier es aus

Die View, der Trigger und der Index

Entferne die View order_totals, den Trigger take_stock und den Index orders_customer.

SQLleere Datenbank

Sieh es dir an

Erst die Eltern

Eine Tabelle, auf die andere zeigen, kann nicht verschwinden, solange Zeilen auf sie zeigen:

SQLleere Datenbank

DROP TABLE löscht zuerst alle Zeilen, und der Fremdschlüssel in orders lässt Kunden mit Bestellungen nicht verschwinden.

Übung

Eine leere Datenbank

Entferne die fünf Tabellen so, dass kein DROP mit einem Fehler abbricht. Am Ende darf nichts in der Datenbank übrig sein.

SQLleere Datenbank
Genauer, für Neugierige

orders vor order_items geht auch, aber durch Zufall: ON DELETE CASCADE löscht die Zeilen der Bestellungen, bevor die Tabelle verschwindet. Ohne CASCADE bricht dieselbe Reihenfolge ab. Die sichere Reihenfolge ist immer von den Kindern zu den Eltern. In PostgreSQL entfernt DROP TABLE … CASCADE auch alles, was von der Tabelle abhängt: praktisch und gefährlich.

Die Idee

Der ganze Weg

Die Datenbank ist leer wie am Anfang. Unterwegs gab es:

  1. Etappe 1: die fünf CREATE TABLE mit Schlüsseln, NOT NULL, UNIQUE, CHECK, DEFAULT und CASCADE.
  2. Etappe 2: INSERT, RETURNING, eine Transaktion mit BEGIN und COMMIT, ROLLBACK und INSERT … SELECT.
  3. Etappe 3: die Fragen mit JOIN, LEFT JOIN, GROUP BY, WITH und COALESCE.
  4. Etappe 4: UPDATE, DELETE und Upsert, mit den Regeln, die die falschen abweisen.
  5. Etappe 5: ein Index, eine View, ein Trigger und ALTER TABLE.
  6. Etappe 6: ein Bericht mit Fenstern, eine Kopie mit VACUUM INTO und DROP.

Auf deinem Computer ist der letzte Schritt, die Datei bakery.db zu löschen. In PostgreSQL ist es DROP DATABASE bakery;, ausgeführt aus einer anderen Datenbank, während niemand mit ihr verbunden ist.

Test

Teste dich

1. Was ist der Unterschied zwischen SUM(t.total) mit GROUP BY und SUM(SUM(t.total)) OVER ()?
2. Warum bricht DROP TABLE customers mit einem Fehler ab, solange es Bestellungen gibt?
3. Du löschst die Tabelle order_items. Was passiert mit der View order_totals?

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