Errata »Datenbanksysteme«, 1. Auflage 2022

Seite 65, Pseudo-Code-Listing zur Anwendung von Transaktionen

Im ersten else-Block fehlt das ROLLBACK-Kommando. Das vollständige Listing sieht so aus:

BEGIN;
SELECT balance FROM accounts WHERE id=5432 INTO @currentbalance;
if @currentbalance >= 1000:
    UPDATE accounts SET balance = balance - 1000 WHERE id = 5432;
    UPDATE accounts SET balance = balance + 1000 WHERE id = 8787;
    COMMIT;
    if @commit_ok:
        print("Transaktion durchgeführt.")
    else:
        ROLLBACK;  -- diese Zeile fehlt im Buch
        print("Transaktion gescheitert, versuchen Sie es später wieder.")
else:
    ROLLBACK;
    print("Transaktion gescheitert, zu wenig Geld auf dem Konto.")

Seite 86/Seite 658, Wiederholungsfrage »Wie ist die Prüfung Relational DBMS im März 2023 ausgefallen?«

Die dargestellten Daten sind aus dem Jahr 2022, es muss also März 2022 in der Fragestellung heißen.

Aber nicht nur die Angabe ist fehlerhaft, auch die auf S. 658 präsentierte Lösung. Die Prüfung ist gut ausgefallen, zweimal Note 2 (gut), einmal Note 3 (befriedigend) — siehe Tabelle results, alle Einträge mit examid=732.

Seite 166, Abbildung 4.22, Modellierung in der erweiterten Chen-Notation

Bei dieser Abbildung ist die Beschriftung in der mc-Notation durcheinandergekommen. Das folgende Bild zeigt die korrekte Darstellung.

Abb. 4.22 (Erweiterte Chen-Notation)

Seite 176, Abbildung 4.32

Bei dieser Abbildung sollte der obere Pfeil zum Datensatz mit der ID 2345 zeigen. Die korrigierte Abbildung sieht so aus:

Seite 230, Beispiel zu eigenen Datentypen

Kurz vor dem Ende des Listings muss es SELECT * FROM contacts heißen, nicht SELECT * FROM tsttype.

Seite 245, CREATE TABLE in PostgreSQL

Die zweite Zeile des CREATE TABLE-Kommando endet mit s!. Die beiden Zeichen sind versehentlich in das Manuskript gerutscht. Das Listing sollte so aussehen:

CREATE TABLE tablename(
  id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, 
  ...)

Seite 249, Abbildung 6.3 (Funktionsweise von Primär- und Fremdschlüsseln)

Bei dieser Abbildung sollte der Verknüpfungspfeil zum publishers-Datensatz mit der ID 2 zeigen.

Seite 264, Wiederholungsfrage zu reflexiven Verknüpfungen

Das CREATE TABLE-Kommando wird in dieser Form von MySQL nicht korrekt verarbeitet. Es kommt zwar zu keiner Fehlermeldung, aber die Foreign-Key-Regel wird einfach ignoriert. Korrekt muss das Kommando so aussehen:

CREATE TABLE employees (
      id       INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
      name     VARCHAR(100) NOT NULL,
      role     VARCHAR(100),
      superior INT,
      FOREIGN KEY (superior) REFERENCES employees(id)
               ON DELETE CASCADE
               ON UPDATE SET NULL)

Seite 326, CREATE-TABLE-Listing

Die Zeilen für die Spalten done und ts gehören zur Tabelle entries (nicht categories wie abgedruckt). In den Beispieldateien zum Buch ist die Zuordnung korrekt.

Seite 644, Beispiel zum Kommando mysql

Im Kommando wird der falsche Port für den Zugang zu den Beispieldatenbanken zum Buch angegeben. Richtig ist Port 33306, das Kommando muss also so lauten:

mysql -u db-buch -h kofler.info -p --port 33306

Seite 483, MVCC-Implementierungsdetails

Im vierten Absatz fehlt ein nicht: »Zum Zeitpunkt 4 erzeugt Transaktion 498 einen neuen Datensatz. Wegen des Rollbacks wird dieser Datensatz aber NICHT dauerhaft gespeichert. Seine Existenz endet mit dem Abschluss der Transaktion.«

Seite 658, Lösung zur verknüpften Tabellen (Überschrift »Prüfungen«)

Siehe oben, Seite 86.

Seite 685, Lösung zum CHECK-Ausdruck

Die obere Schranke ist 1000, nicht 0. Damit sieht der Code korrekt so aus:

CREATE TABLE mytable (
  ...
  mycolumn DOUBLE NOT NULL 
           CHECK (mycolumn >= 0.0 && mycolumn <= 1000.0),
  ...)

Seite 695, Lösung zu den B-Trees-Wiederholungsaufgaben

Der letzte Absatz der Seite muss wie folgt lauten. Es ändert sich nur ein Buchstabe, G -> C, fett markiert:

Für Q ist im letzten Teilknoten kein Platz mehr. Dieser Knoten wird beim Buchstaben O in zwei Teile getrennt (M, N sowie P, Q). O hat allerdings auch im Startknoten keinen Platz mehr. Deswegen muss auch dieser Knoten (C, F, I, L und O) zerlegt werden. Der neue Startknoten bekommt den mittleren Buchstaben I. Der Baum hat nun eine Tiefe von drei und ist vollkommen symmetrisch.

Seite 697, Lösung zu Non-clustered versus Clustered Index

Der letzte Satz im ersten Absatz nennt irrtümlich einen Clustered Index, obwohl ein Non-clustered Index gemeint ist. Richtig heißt es: Es kan beliebig viele Non-Clustered Indices geben.

Seite 718, Lösung zur employees-Aufgabe

Gefragt war das höchste Gehalt eines Mitarbeiters bzw. einer Mitarbeiterin im Jahr 2000. Die Bedingung YEAR(from_date)=2000 führt zum richtigen Ergebnis. Es hätte aber sein können, dass ein Mitarbeiter schon vor 2000 eingestellt wurde, aber im Jahr 2000 keine Gehaltserhöhung bekommen hat. Um auch diesen Sonderfall zu berücksichtigen, muss die Bedingung YEAR(from_date) <= 2000 lauten.

Seite 720, Lösung zur cloudb-Aufgabe

Die Berechnung für die ersten fünf Tage (erst Zeile der Seite) ist falsch: 5 € ist der Preis pro Monat. Der Preis pro Tag ergibt sich, indem der Preis mit 12 multipliziert und mit 365 dividiert wird. Die Multiplikation mit 12 habe ich vergessen. Daher:

Für die ersten fünf Tage: (5 € × 4 + 5 € × 6) × 0,95 * 12 / 365 × 5 = 7,80 €

Die weiteren Zwischenergebnisse (dritte + vierte Zeile) sowie die INSERT-Kommandos müssen entsprechend angepasst werden.

Letzte Änderung 25.2.2024. Vielen Dank an alle Leser und Leserinnen, die mir Feedback geben!