Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
| modul:m290_guko:learningunits:lu08:theorie:c_fk-create-table [2025/10/19 21:51] – gkoch | modul:m290_guko:learningunits:lu08:theorie:c_fk-create-table [2025/11/05 11:23] (aktuell) – gkoch | ||
|---|---|---|---|
| Zeile 5: | Zeile 5: | ||
| ==== ERD (Überblick) ==== | ==== ERD (Überblick) ==== | ||
| Wir gehen vom Schema aus dem Reiseblog-Beispiel aus: | Wir gehen vom Schema aus dem Reiseblog-Beispiel aus: | ||
| - | {{ : | + | |
| + | {{ : | ||
| <WRAP tip round 80% center> | <WRAP tip round 80% center> | ||
| Posts können mehreren Kategorien angehören (N:M). Die saubere Lösung ist eine Zwischentabelle '' | Posts können mehreren Kategorien angehören (N:M). Die saubere Lösung ist eine Zwischentabelle '' | ||
| - | Das bauen wir später (s. LU08e: N: | + | Das bauen wir später (s. LU08e: N: |
| </ | </ | ||
| ===== Fremdschlüssel: | ===== Fremdschlüssel: | ||
| + | <WRAP center tip round 80%> | ||
| + | [[https:// | ||
| + | </ | ||
| + | |||
| <WRAP box round center 80%> | <WRAP box round center 80%> | ||
| <code sql> | <code sql> | ||
| Zeile 26: | Zeile 31: | ||
| ===== Beispiel Reiseblog ===== | ===== Beispiel Reiseblog ===== | ||
| + | |||
| + | <WRAP center tip round 80%> | ||
| + | [[https:// | ||
| + | </ | ||
| ==== 1. Tabellen anlegen ==== | ==== 1. Tabellen anlegen ==== | ||
| Zeile 135: | Zeile 144: | ||
| === Verknüpfung Tabelle users & posts (one-to-many) === | === Verknüpfung Tabelle users & posts (one-to-many) === | ||
| - | {{ : | + | {{: |
| === Tabelle categories (wird später mit ' | === Tabelle categories (wird später mit ' | ||
| - | {{ : | + | {{: |
| ==== 3. Fremdschlüssel in Aktion (Standard: RESTRICT) ==== | ==== 3. Fremdschlüssel in Aktion (Standard: RESTRICT) ==== | ||
| - | Beim setzen | + | Beim Setzen |
| - | Was heisst | + | |
| - | <WRAP center box 80% round>< | + | Bezogen auf unser Reiseblog-Beispiel: '' |
| - | -- Sicherheit: Welche FKs sind gesetzt? | + | Damit ist //users// die Elterntabelle und //posts// die Kindtabelle. Die Folge von '' |
| - | SHOW CREATE TABLE posts; | + | |
| - | </code>< | + | * Löschen eines Users ist blockiert, solange Posts auf diesen User verweisen. |
| + | * Ändern von '' | ||
| + | * Änderungen an nicht referenzierten Spalten (z. B. '' | ||
| + | |||
| + | Probieren Sie folgende Codesnippets in Webstorm/ | ||
| - | Demo 1 – User ohne Posts löschen (erlaubt): | + | === Demo 1 – User ohne Posts löschen (erlaubt) |
| <WRAP center box 80% round>< | <WRAP center box 80% round>< | ||
| DELETE FROM users | DELETE FROM users | ||
| Zeile 156: | Zeile 168: | ||
| SELECT user_id, username FROM users; | SELECT user_id, username FROM users; | ||
| </ | </ | ||
| - | Erwartung: Die Zeile wird gelöscht (keine Posts verweisen auf den User). | + | //Erwartung: Die Zeile wird gelöscht (keine Posts verweisen auf den User).// |
| - | Demo 2 – User mit Posts löschen (blockiert): | + | === Demo 2 – User mit Posts löschen (blockiert) |
| <WRAP center box 80% round>< | <WRAP center box 80% round>< | ||
| DELETE FROM users | DELETE FROM users | ||
| WHERE username = ' | WHERE username = ' | ||
| </ | </ | ||
| - | Erwartete Fehlermeldung (sinngemäss): | + | //Erwartete Fehlermeldung (sinngemäss): |
| - | <WRAP alert round 80%> | + | <WRAP alert round 80% center> |
| [23000][1451] Cannot delete or update a parent row: a foreign key constraint fails | [23000][1451] Cannot delete or update a parent row: a foreign key constraint fails | ||
| (travel_blog.posts, | (travel_blog.posts, | ||
| </ | </ | ||
| - | Grund: In posts.author_id gibt es Kindzeilen (z.B. " | + | //Grund: In posts.author_id gibt es Kindzeilen (z.B. " |
| - | Demo 3 – Unkritisches Attribut ändern (erlaubt): | + | === Demo 3 – Unkritisches Attribut ändern (erlaubt) |
| <WRAP center box 80% round>< | <WRAP center box 80% round>< | ||
| UPDATE users | UPDATE users | ||
| Zeile 177: | Zeile 189: | ||
| </ | </ | ||
| - | Demo 4 – Primärschlüssel ändern (blockiert, RESTRICT): | + | === Demo 4 – Primärschlüssel ändern (blockiert) |
| <WRAP center box 80% round>< | <WRAP center box 80% round>< | ||
| UPDATE users | UPDATE users | ||
| Zeile 183: | Zeile 195: | ||
| WHERE user_id = 2; -- erwartet: Fehler (RESTRICT), da posts.author_id -> users.user_id | WHERE user_id = 2; -- erwartet: Fehler (RESTRICT), da posts.author_id -> users.user_id | ||
| </ | </ | ||
| - | Erklärung: posts.author_id → users.user_id ist ein FK mit Standard ON UPDATE RESTRICT. Solange Posts existieren, darf der user_id-Wert nicht verändert werden. | + | //Erklärung: posts.author_id → users.user_id ist ein FK mit Standard ON UPDATE RESTRICT. Solange Posts existieren, darf der user_id-Wert nicht verändert werden.// |
| - | Demo 5 – Kategorie-ID | + | === Demo 5 – Primärschlüssel |
| <WRAP center box 80% round>< | <WRAP center box 80% round>< | ||
| UPDATE categories | UPDATE categories | ||
| Zeile 201: | Zeile 213: | ||
| <WRAP tip round 80% center> | <WRAP tip round 80% center> | ||
| - | Merke: Fremdschlüssel geben dir Datensicherheit: | + | Merke: Fremdschlüssel geben Datensicherheit: |
| * Verhindern verwaiste Daten (z. B. Posts ohne gültigen Autor), | * Verhindern verwaiste Daten (z. B. Posts ohne gültigen Autor), | ||
| * definieren klares Verhalten bei Löschen/ | * definieren klares Verhalten bei Löschen/ | ||