Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Beide Seiten der vorigen Revision Vorhergehende Überarbeitung | |||
| de:modul:m290_guko:learningunits:lu08:theorie:c_fk-create-table [2026/10/17 14:03] – gkoch | de:modul:m290_guko:learningunits:lu08:theorie:c_fk-create-table [2026/10/17 16:40] (aktuell) – gkoch | ||
|---|---|---|---|
| Zeile 3: | Zeile 3: | ||
| ===== Lernziele ===== | ===== Lernziele ===== | ||
| * Ich kann mit ALTER TABLE eine Spalte und einen Fremdschlüssel zu einer bestehenden Tabelle hinzufügen. | * Ich kann mit ALTER TABLE eine Spalte und einen Fremdschlüssel zu einer bestehenden Tabelle hinzufügen. | ||
| - | * Ich kann die Referenzaktionen | + | * Ich kann erklären, was RESTRICT, CASCADE und SET NULL beim Löschen bewirken. |
| - | * Ich kann für eine Beziehung begründen, welche Referenzaktion | + | * Ich kann für eine Beziehung begründen, welche Referenzaktion |
| - | ===== Ausgangslage | + | ===== Wozu nachträglich? |
| + | Eine Datenbank entsteht selten in einem Zug. Oft gibt es die Tabellen schon, samt Daten, und dann kommt eine neue Spalte oder eine neue Verknüpfung dazu. | ||
| - | <WRAP center round important 80%> | + | Bei Ihren Cases aus LU05 ist das genau so. Dort haben Sie die Spalten für die Fremdschlüssel angelegt, aber noch nicht als Fremdschlüssel gesetzt. Das holen Sie mit **ALTER TABLE** nach. |
| - | Führen | + | |
| - | </ | + | |
| - | In der Praxis entsteht eine Datenbank selten in einem Zug. Oft existieren Tabellen schon mit Daten – und es kommt eine neue Spalte oder eine neue Verknüpfung dazu. Genau so ist es bei Ihren Cases aus LU05: Dort haben Sie die Fremdschlüssel-Spalten angelegt, aber noch nicht als Fremdschlüssel gesetzt. Das holen Sie mit **ALTER TABLE** nach. | + | Wir bleiben beim Reiseblog |
| ===== ALTER TABLE ===== | ===== ALTER TABLE ===== | ||
| + | Zuerst kommt die neue Spalte in die bestehende Tabelle: | ||
| - | **Spalte zu einer bestehenden Tabelle hinzufügen: | ||
| <WRAP center box 80% round>< | <WRAP center box 80% round>< | ||
| - | ALTER TABLE tabellenname | + | ALTER TABLE kind_tabelle |
| ADD COLUMN neue_spalte DATENTYP; | ADD COLUMN neue_spalte DATENTYP; | ||
| </ | </ | ||
| - | **Fremdschlüssel | + | Danach wird genau diese Spalte zum Fremdschlüssel: |
| <WRAP center box 80% round>< | <WRAP center box 80% round>< | ||
| ALTER TABLE kind_tabelle | ALTER TABLE kind_tabelle | ||
| ADD CONSTRAINT fk_name | ADD CONSTRAINT fk_name | ||
| - | FOREIGN KEY (fremdschluessel) | + | FOREIGN KEY (neue_spalte) |
| REFERENCES eltern_tabelle (primaerschluessel) | REFERENCES eltern_tabelle (primaerschluessel) | ||
| ON DELETE referenzaktion; | ON DELETE referenzaktion; | ||
| </ | </ | ||
| - | // | + | Den // |
| ===== Die drei Referenzaktionen ===== | ===== Die drei Referenzaktionen ===== | ||
| - | Mit '' | + | Mit '' |
| <WRAP center box 80% round> | <WRAP center box 80% round> | ||
| - | ^ Referenzaktion ^ Was passiert mit den Kindzeilen? ^ Typisches | + | ^ Referenzaktion ^ Was passiert mit den Kindzeilen? ^ Beispiel ^ |
| - | | **RESTRICT** | Nichts | + | | **RESTRICT** | Nichts. Das Löschen |
| - | | **CASCADE** | Sie werden | + | | **CASCADE** | Sie werden mitgelöscht. | Wird ein Post gelöscht, verschwinden seine Kommentare | |
| - | | **SET NULL** | Sie bleiben, der Verweis wird **leer** (NULL) | Eine optionale | + | | **SET NULL** | Sie bleiben, der Verweis wird leer (NULL). | Eine Redaktorin wird gelöscht, |
| </ | </ | ||
| + | |||
| + | Ohne Angabe gilt **RESTRICT**. Das haben wir auf der letzten Seite gesehen, als sich Martin nicht löschen liess. | ||
| <WRAP center round info 80%> | <WRAP center round info 80%> | ||
| - | Wird keine Referenzaktion angegeben, gilt **RESTRICT** – das haben Sie in LU08b erlebt. (Genau genommen | + | In MySQL heisst der Standard |
| - | Neben '' | + | Neben '' |
| </ | </ | ||
| - | **Die Leitfrage für die Wahl: | + | Für die Wahl hilft eine Frage: **Ergibt die Kindzeile ohne ihre Elternzeile noch Sinn?** |
| - | * Nein, sie wäre nutzlos | + | * Nein, sie wäre nutzlos. Dann passt **CASCADE**. |
| - | * Ja, der Verweis ist nur eine Zusatzinformation | + | * Ja, der Verweis ist nur eine Zusatzinformation. Dann passt **SET NULL**. |
| - | * Das Löschen | + | * Die Elternzeile |
| ===== Beispiel 1: SET NULL ===== | ===== Beispiel 1: SET NULL ===== | ||
| - | Jeder Post bekommt | + | Jeder Post bekommt eine Redaktorin, die den Text gegenliest |
| **Spalte ergänzen und befüllen: | **Spalte ergänzen und befüllen: | ||
| Zeile 71: | Zeile 73: | ||
| </ | </ | ||
| - | Beachten Sie das '' | + | Wichtig ist das '' |
| **Fremdschlüssel setzen:** | **Fremdschlüssel setzen:** | ||
| Zeile 89: | Zeile 91: | ||
| </ | </ | ||
| - | **Ergebnis: | + | Shaolin ist gelöscht. Den Lissabon-Post |
| <WRAP center round tip 80%> | <WRAP center round tip 80%> | ||
| - | **Warum durfte | + | Shaolin |
| </ | </ | ||
| ===== Beispiel 2: CASCADE ===== | ===== Beispiel 2: CASCADE ===== | ||
| - | Wir ergänzen eine Tabelle // | + | Jetzt kommen Kommentare dazu. Jeder Kommentar gehört zu genau einem Post. Ohne seinen |
| **Tabelle anlegen:** | **Tabelle anlegen:** | ||
| Zeile 112: | Zeile 114: | ||
| </ | </ | ||
| - | Hier steht der Fremdschlüssel direkt im CREATE TABLE, wie in LU08b – Referenzaktionen funktionieren | + | Hier steht der Fremdschlüssel direkt im CREATE TABLE, wie auf der letzten Seite. Eine Referenzaktion lässt sich auf beiden Wegen angeben. |
| **Befüllen: | **Befüllen: | ||
| Zeile 129: | Zeile 131: | ||
| </ | </ | ||
| - | **Ergebnis: | + | Der Utrecht-Post ist weg, und mit ihm seine beiden |
| <WRAP center round important 80%> | <WRAP center round important 80%> | ||
| - | CASCADE ist praktisch, aber mächtig: | + | CASCADE ist bequem, aber mit Vorsicht zu geniessen. |
| </ | </ | ||
| Zeile 140: | Zeile 142: | ||
| <WRAP center box 80% round> | <WRAP center box 80% round> | ||
| ^ Referenzaktion ^ Wann einsetzen? ^ | ^ Referenzaktion ^ Wann einsetzen? ^ | ||
| - | | RESTRICT | Standard. | + | | RESTRICT | Standard. |
| - | | CASCADE | Wenn die Kindzeilen ohne Elternzeile nutzlos | + | | CASCADE | Die Kindzeilen |
| - | | SET NULL | Wenn der Verweis | + | | SET NULL | Der Verweis ist freiwillig |
| </ | </ | ||
| Zeile 148: | Zeile 150: | ||
| {{youtube> | {{youtube> | ||
| //ON DELETE: NO ACTION, SET NULL, CASCADE, SET DEFAULT (9:22 min, deutsch). Quelle: Prof. Dr. Jens Dittrich / YouTube\\ | //ON DELETE: NO ACTION, SET NULL, CASCADE, SET DEFAULT (9:22 min, deutsch). Quelle: Prof. Dr. Jens Dittrich / YouTube\\ | ||
| - | Das Video zeigt zusätzlich SET DEFAULT | + | Das Video zeigt zusätzlich SET DEFAULT. Diese Option brauchen wir im Modul nicht.// |
| </ | </ | ||