Arbeiten mit Fremdschlüsselbedingungen
In diesem letzten Schritt werden wir untersuchen, wie Fremdschlüsselbedingungen dazu beitragen, die Datenintegrität zwischen verwandten Tabellen aufrechtzuerhalten. Fremdschlüsselbedingungen stellen sicher, dass die Beziehungen zwischen Tabellen gültig bleiben, indem sie Operationen verhindern, die isolierte Datensätze (orphaned records) oder inkonsistente Daten erzeugen würden.
Versuchen wir, zu verstehen, wie Fremdschlüsselbedingungen funktionieren, anhand einiger Beispiele:
Zunächst versuchen wir, ein Buch mit einer ungültigen author_id
hinzuzufügen:
-- This will fail due to foreign key constraint
INSERT INTO books (title, author_id, publisher_id, publication_year, price)
VALUES ('Failed Book', 999, 1, 2023, 29.99);
Sie werden eine Fehlermeldung sehen, weil author_id
999 in der authors
-Tabelle nicht existiert:
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`bookstore`.`books`, CONSTRAINT `books_ibfk_1` FOREIGN KEY (`author_id`) REFERENCES `authors` (`author_id`))
Diese Fehlermeldung zeigt an, dass die Fremdschlüsselbedingung für die Spalte author_id
in der books
-Tabelle es verhindert, ein Buch hinzuzufügen, das auf eine author_id
verweist, die in der authors
-Tabelle nicht existiert.
Ebenso können wir keinen Autor löschen, der Bücher veröffentlicht hat, ohne zunächst seine Bücher zu behandeln:
-- This will fail due to foreign key constraint
DELETE FROM authors WHERE author_id = 1;
Wenn Sie versuchen, den Autor mit author_id = 1
direkt zu löschen, tritt ein Fremdschlüsselfehler auf, weil es Bücher gibt, die auf diese author_id
verweisen. Dies ist MySQLs Weg, sicherzustellen, dass Ihre Daten konsistent bleiben.
Um einen Autor und seine Bücher sicher zu löschen, müssen wir entweder:
- Zunächst die Bücher löschen und dann den Autor. Dies stellt sicher, dass wir keine isolierten Datensätze haben.
CASCADE DELETE
verwenden (das wir in fortgeschrittenen Labs untersuchen werden).
Sehen wir uns an, wie man ein Buch und seinen Autor richtig entfernt, indem man zunächst das Buch löscht:
-- First, delete the books by this author
DELETE FROM books WHERE author_id = 1;
-- Now we can safely delete the author
DELETE FROM authors WHERE author_id = 1;
Indem Sie zunächst das/die Buch(er) löschen, entfernen Sie die Fremdschlüsselreferenzen, sodass der Autor ohne Verletzung der Bedingungen gelöscht werden kann.