Transaktionen
INSERT · UPDATE · DELETEEine oder mehrere Datenbankoperationen, die Daten einfügen, ändern oder löschen. Danach müssen die Daten stimmig sein. CRUD: Create, Read, Update, Delete.
Aufgabe 11
Finde heraus, welche Fehler beim Einfügen, Ändern und Löschen von Daten entstehen können – und wie sich eine Datenbank davor schützt.
Entdecken
In InstaHub werden ständig Daten gelesen, gespeichert, geändert und gelöscht. Zu jeder Situation gehört ein SQL-Befehl.
Tipp: Karte antippen, dann Feld antippen. Eine gesetzte Karte zweimal antippen, um sie zurückzulegen.
Kreuze an: Nach welchen Befehlen sind die gespeicherten Daten anders als vorher?
SELECT kennst du schon aus den SQL-Aufgaben. Die anderen drei Befehle sind englische Verben.
insert heißt einfügen, update heißt aktualisieren, delete heißt löschen. Welche Situation passt zu welchem Verb?
Hochladen erzeugt einen neuen Datensatz – das ist INSERT. Beim Ändern der Beschreibung bleibt das Foto, nur ein Wert wird ersetzt. Ordne SELECT und DELETE genauso zu.
Daten müssen gepflegt werden: Datensätze werden eingefügt, geändert und gelöscht. Das nennt man Datenpflege.
Eine Transaktion besteht aus einer oder mehreren Datenbankoperationen, mit denen Daten eingefügt, geändert oder gelöscht werden. Sie soll fehlerfrei ausgeführt werden: Danach müssen die Daten in der Datenbank stimmig sein.
CRUD fasst die vier Grundoperationen zusammen:
Nur SELECT verändert den Datenbestand nicht.
INSERT INTO tabelle (spalte1, spalte2)
VALUES (wert1, wert2)
UPDATE tabelle
SET spalte = wert
WHERE bedingung
DELETE FROM tabelle
WHERE bedingung
Achtung: Ohne WHERE ändert UPDATE bzw. löscht DELETE alle Zeilen der Tabelle.
Entdecken
InstaHub speichert hier Benutzer- und Fotodaten wieder in einer einzigen Tabelle – wie bei der Idee aus Aufgabe 2. Nele Hohenstein heißt jetzt Nele Schweizer und schreibt dem Support: »Ich bin die mit dem Park-Foto.«
users_photos(name: varchar(255), username: varchar(255), url: varchar(255), description: varchar(255))
UPDATE users_photos
SET name = 'Nele Schweizer'
WHERE description LIKE '%Park%'
Lies die WHERE-Bedingung: Welche Zeilen enthalten in description das Wort Park?
Vergleiche die Spalte name in allen Zeilen, in denen username nelefitmuse steht.
Nur die Zeile mit dem Park-Foto wurde geändert. Für nelefitmuse stehen jetzt zwei verschiedene Namen in der Tabelle – überlege, was das für die Daten bedeutet.
Beim Ändern von Daten können Inkonsistenzen (= Unstimmigkeiten) entstehen. Solche Fehler bei der Datenpflege nennt man Anomalien.
Neles Name steht dreimal in der Tabelle, geändert wurde er aber nur einmal. Mit WHERE username = 'nelefitmuse' hätte es geklappt – aber nur, weil man daran gedacht hat. Bei Redundanz muss jede Änderung alle Kopien treffen.
Du kennst das Problem aus Aufgabe 2, als du die E-Mail-Adresse geändert hast.
Verstehen
Jannik Wegener möchte seine Fotos loswerden, sein Konto mit Name und Benutzername soll aber bleiben. Der Support löscht deshalb die Zeilen mit seinem Namen.
users_photos(name: varchar(255), username: varchar(255), url: varchar(255), description: varchar(255))
DELETE FROM users_photos
WHERE name LIKE 'Jannik%'
Lies die Anweisung: Welche Zeilen erfüllen die Bedingung name LIKE 'Jannik%'?
DELETE löscht immer ganze Zeilen. Wo in der Tabelle standen Janniks Name und Benutzername?
Janniks Name und Benutzername standen nur in den Zeilen seiner beiden Fotos. Beide Zeilen sind gelöscht – überlege, was jetzt noch über Jannik bekannt ist.
Beim Löschen von Daten können mehr Informationen verloren gehen als gewollt.
Mit den beiden Zeilen sind nicht nur Janniks Fotos samt Hashtags verschwunden, sondern auch sein Name und sein Benutzername. Jannik ist gar nicht mehr gespeichert.
Anwenden
Ein Foto aus Florida wird eingefügt. In der Anweisung fehlt, wer es hochgeladen hat.
users_photos(name: varchar(255), username: varchar(255), url: varchar(255), description: varchar(255))
INSERT INTO users_photos (url, description)
VALUES ('storage/photos/2/1480.webp', '#usa #florida #everglades')
NULL bedeutet: In dieser Zelle ist kein Wert gespeichert.
Vergleiche die Spalten in der Anweisung mit den Spalten der Tabelle. Welche fehlen?
Für Spalten, die in der Anweisung fehlen, wird kein Wert gespeichert. Die Tabelle zeigt dann NULL.
name und username der neuen Zeile sind NULL – das Foto hat keinen Besitzer. Überlege außerdem umgekehrt: Welche Spalten blieben leer, wenn ein Benutzer ohne Foto eingefügt würde?
Beim Einfügen von Daten können relevante Informationen fehlen.
Das Foto aus Florida steht ohne Besitzer in der Tabelle. Umgekehrt ließe sich ein neuer Benutzer ohne Foto nur mit leeren Foto-Spalten speichern.
Ursache aller drei Anomalien: Benutzer- und Fotodaten stehen redundant in einer Tabelle. Die Lösung kennst du aus den Aufgaben 2 bis 4: getrennte Tabellen users und photos, verbunden über den Fremdschlüssel user_id[users].
Verstehen
InstaHub speichert Benutzer und Fotos jetzt in getrennten Tabellen. Die Datenbank enthält hier nur die Datensätze von Nele und Jannik.
users(id: int, name: varchar(255), username: varchar(255), birthday: date, …)
photos(id: int, description: varchar(255), url: varchar(255), user_id[users]: int, …)
Tipp: Karte antippen, dann Feld antippen. Eine gesetzte Karte zweimal antippen, um sie zurückzulegen.
Sieh dir bei jeder Anweisung die Werte hinter VALUES bzw. SET an und suche sie in den Tabellen.
Prüfe drei Dinge: Ist die neue id schon vergeben? Gibt es den Benutzer, auf den user_id verweist? Passt der Wert zum Datentyp im Tabellenschema?
In A ist die id 1001 schon vergeben – sie gehört zu Neles Park-Foto. Prüfe B und C genauso.
Integrität (lat. integritas) bedeutet »Unversehrtheit«. Bei Änderungen der Daten muss die logische Übereinstimmung in der Datenbank erhalten bleiben.
Ein Datenbanksystem fordert dafür Bedingungen, die Integritätsbedingungen. Sind sie erfüllt, ist die Datenbank konsistent (stimmig): Es gibt keine widersprüchlichen Datensätze. Verstößt eine Anweisung gegen eine Integritätsbedingung, führt das Datenbanksystem sie nicht aus.
Integrität ist nicht dasselbe wie Datenschutz: Wer Daten sehen oder ändern darf, regeln Benutzerrechte.
Übertragen
Du kennst die AG-Anmeldungen der Schule aus Aufgabe 8. Die Tabelle ag hat jetzt zusätzlich die Spalte plaetze.
schueler(id: int, name: varchar(255))
ag(id: int, name: varchar(255), plaetze: int)
teilnahme(schueler_id[schueler]: int, ag_id[ag]: int)
Tipp: Karte antippen, dann Feld antippen. Eine gesetzte Karte zweimal antippen, um sie zurückzulegen.
Suche die Werte aus jeder Anweisung in den drei Tabellen und vergleiche sie mit den Datentypen im Tabellenschema.
Stelle zu jeder Anweisung drei Fragen: Ist die neue id schon vergeben? Gibt es den Datensatz, auf den ein Fremdschlüssel zeigt? Passt jeder Wert zum Datentyp?
Anweisung 1 verwendet die id 3, die der Chor schon hat – das verletzt die Entitätsintegrität. Prüfe die anderen drei Anweisungen genauso.
Abschlussübersicht
Hier siehst du die Merksätze und die richtigen Ergebnisse aller sechs Lernschritte.
INSERT · UPDATE · DELETEEine oder mehrere Datenbankoperationen, die Daten einfügen, ändern oder löschen. Danach müssen die Daten stimmig sein. CRUD: Create, Read, Update, Delete.
users_photosUPDATE-Anomalie: Beim Ändern entstehen Inkonsistenzen. DELETE-Anomalie: Beim Löschen geht mehr verloren als gewollt. INSERT-Anomalie: Beim Einfügen fehlen relevante Informationen. Ursache: Redundanz.
Primärschlüssel · Datentyp · FremdschlüsselEntitätsintegrität: Primärschlüssel eindeutig und nie NULL. Wertebereichsintegrität: Wert im festgelegten Wertebereich. Referentielle Integrität: Fremdschlüssel verweist auf einen existierenden Datensatz.
Sichern
Kreuze alle richtigen Antworten an. Bei manchen Fragen sind mehrere Antworten richtig.