SQL Grundkurs 1: Die Sprache erlernen

FOREIGN KEY

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
Beziehungen werden in Datenbanken über Fremdschlüssel implementiert. Dieses Constraint steht bei diesem Lern-Video im Mittelpunkt.

Transkript

In diesem Video sehen Sie, wie Sie eine Tabelle mit einer Beziehung zur anderen Tabelle erzeugen. Wir müssen dazu ein sogenanntes "Foreign Key Constrained" erzeugen. Und zwar möchte ich das mit folgendem Beispiel zeigen: Ich möchte die zwei Tabellen "Schulungen" und "Kategorien" erzeugen, wobei "Schulungen" auf die Schulungs-Kategorien verweisen. Der Fremdschlüssel gehört in dem Fall zur Tabelle "Schulungen", denn dieser referenziert auf die "Kategorien". Damit ich auf die "Kategorien" referenzieren kann, muss es diese Tabelle zuerst geben. Die Anweisung dafür habe ich schon vorbereitet. Die Tabelle "Kategorien" besteht einfach aus einem Kürzel, das habe ich "Kat" genannt, mit einem Datentyp "Character2", einem fixen Charakter, einer Bezeichnung, die maximal dreißig Zeichen lang ist, und nicht leer sein darf. Außerdem habe ich die "Kat", also das Kat-Kürzel bereits hier als Premierschlüssel definiert. Ich führe diese Anweisung gleich einmal aus, kontrolliere, ob es erfolgreich gewesen ist, jawohl, es hat funktioniert. Außerdem habe ich hier drei Insatz-Statements vorbereitet, damit ich in diese neue Tabelle gleich einmal ein paar Datensätze einfügen kann. Ich möchte jetzt hier "IT", Informationstechnologie, "MA", Marketing, und "VT", Vertrieb einfügen. Dazu führe ich diese drei Anweisungen der Reihe nach aus, und jetzt habe ich diese drei Datensätze hier auch schon eingefügt. Nachfolgend sehen Sie hier die Anweisung, die uns die Schulungs-Tabelle erzeugt. Die Schulungs-Tabelle besteht aus einer ID, einer Bezeichnung und hier "Kategorie", das ist die entscheidende Spalte für unser Beispiel. Dies wird die Fremdschlüsselspalte für die Beziehung zur Tabelle "Kategorie". Ob die Spalte den gleichen Namen trägt, wie die referenzierte Spalte, ist irrelevant, entscheidend ist hier der Datentyp. Der Datentyp muss zusammenpassen, nachdem wir hier als "Character2" die Premierschlüsselspalte definiert haben, muss die Fremdschlüsselspalte, die darauf verweist, ebenso als "Character2" festgelegt werden. Außerdem habe ich hier schon den Premierschlüssel für diese Tabelle definiert. Nun möchte ich den Fremdschlüssel hier ergänzen. Ich könnte das sowohl auf Spaltenebene als auch auf Tabellenebene tun, aber da generell die Anweisung auf Tabellenebene übersichtlicher ist, tue ich es hier. Kleiner Hinweis an dieser Stelle: Beim Microsoft SQL-Server und bei Oracle wäre es irrelevant, weil im SQL, wo wir uns hier befinden, geht es ohnehin nur auf Tabellenebene. Ich ergänze hier im Anschluss an den Premierschlüssel also ein neues Constraint. "FK" verwende ich als Präfix für "Foreign Key", "Schulung", den Namen der Tabelle, und typischerweise ergänzt man bei dem Namen für den Foreign Key den Namen der Zieltabelle, in dem Fall ist es die Tabelle "Kategorien". Der Typ lautet "Foreign Key", und ich muss jetzt definieren, welche Spalte meine Fremdschlüsselspalte sein wird, und das ist hier die Spalte "Kategorie". Diese führe ich hier in runder Klammer an. Noch sind wir nicht fertig. Wir müssen ja definieren, worauf dieser Fremdschlüssel verweist. Das passiert über den Zusatz "References". Damit das Ganze übersichtlicher bleibt, werde ich davor einen Zeilenumbruch einfügen. Wichtig ist, auf keinen Fall ein Komma, denn das ist ja kein neues Constraint, sondern diese Constraint-Definition geht in der nächsten Zeile noch weiter. "References", und jetzt gebe ich die Zieltabelle an, das ist die Tabelle "Wawi.Kategorien". Natürlich muss ich auch angeben, auf welche Spalte ich referenziere, und das ist die hier definierte Premierschlüsselspalte "Kat", diese trage ich hier ein. Damit habe ich die Syntax für meinen Fremdschlüssel fertig. "Constraint", den Namen, den ich hier definiert habe, gefolgt vom Constraint-Typ "Foreign Key", die betroffene Ausgangsspalte, das ist "Kategorie" hier und "References", die Zieltabelle und die Zielspalte. Damit kann ich die Tabelle mit dem Fremdschlüssel nun erzeugen. Nachdem das funktioniert hat, kann ich mich jetzt daran machen, hier erste test-Datensätze einzutragen. Ich habe hier dafür bereits zwei Insert-Anweisungen vorbereitet, eine mit einer korrekten und eine mit einer unkorrekten Kategorie. Ich füge zuerst einmal die korrekte ein, nämlich "IT". Ich starte die Anweisung, und wir sehen, der Vorgang hat funktioniert. Nun verwende ich die Kategorie "KO" für die Schulung "Suppen kochen", das kann natürlich nicht funktionieren. Ich starte die Anweisung, und schon habe ich die Fehlermeldung, die ich erwartet habe: "Cannot add or update a child row a foreign key constraint failes", also die Fremdschlüsselverletzung ist aufgetreten, wie erwartet. Ein Fremdschlüssel wirkt aber auch auf andere Weise. Ich habe hier für die Fortführung des Beispiels noch eine Anweisung vorbereitet, mit der Überschrift "Änderungsweitergabe", diese habe ich aber noch nicht aktiviert. Mit dieser Anweisung ändere ich das Kürzel von der Kategorie "IT" auf "PC". Nachdem aber auf dieses Kürzel von einem Datensatz bereits referenziert wird, verhindert die referenzielle Integrität, dass diese Änderung vorgenommen wird. Das heißt, ich führe diese Anweisung aus und bekomme auch hier die erwartete Fehlermeldung, dass ein "Foreign Key Constraint" verletzt worden ist. Manchmal kann es allerdings in der Praxis sehr hilfreich sein, wenn Änderungen an solchen Kürzeln möglich sind. Dazu kann ich gewisse Dinge zusätzlich bei einer Beziehung definieren, so z.B. die sogenannte "Änderungs- oder Löschweitergabe". Man nennt das "Kaskadierende Änderungen". Was muss ich dazu tun? Dazu muss ich lediglich beim Definieren des Fremdschlüssels eine Ergänzung vornehmen, nämlich die Anweisung "Cascade" und zwar in dem Fall "ON UPDATE", es ginge auch z.B. "ON DELETE CASCADE", das heißt, "Änderungen sollen weitergegeben werden". Das bewirkt, dass ich nun eine Änderung vornehmen kann, und die Änderung an die Detail-Datensätze weiter mitübergeben wird. Um diese Änderung zu testen, lösche ich vorweg noch einmal unsere Tabelle, um sie danach neu zu erstellen. Ich erzeuge die Tabelle "Schulung" also noch einmal neu, mit diesem Zusatz "ON UPDATE CASCADE", und um das Ganze zu testen, muss ich diesen einen Datensatz natürlich auch wieder in die neu erstellte Tabelle einfügen. Das mache ich nun. Zur Kontrolle werfen wir einen Blick in beide Tabellen. In der Tabelle "Schulung" haben wir einen Eintrag, der auf die Kategorie "IT" verweist. In der Tabelle "Kategorien" haben wir vorerst noch keinen Eintrag, denn ich habe hier einen Tippfehler, Sie sehen, die Tabelle heißt "Kategorien", und ich habe hier nur "Kategorie" geschrieben also bessere ich diesen Tippfehler aus, und starte diese Anweisung erneut, und jetzt sehen wir hier unsere drei Einträge. Nachdem ich die Änderungsweitergabe nun aktiv habe, lässt sich die Änderung, die vorher blockiert worden ist, von der referenziellen Integrität, nun problemlos durchführen. Ich ändere das Kürzel für die Kategorie "IT" auf "PC". Ich starte diese Anweisung, und wir sehen, dieses Update hat funktioniert. Einen Kontrollblick in die Kategorie, und wir sehen, dass jetzt wirklich das Kürzel hier "PC" ist. Wir haben keine Fehlermeldung bekommen, und wenn wir nun in die "Schulungen" einen Blick werfen, muss auch hier nun Anstelle von "IT" die Kategorie "PC" eingetragen sein, und das ist auch der Fall. Sie haben nun in diesem Video gesehen, wie Sie für eine Tabelle einen Fremdschlüssel und damit eine Beziehung zu einer anderen Tabelle definieren. Für ein Fremdschlüssel Constraint müssen Sie einerseits definieren, welche Spalte der Ausgangstabelle verwendet wird, auf welche Tabelle referenziert wird, und welche Spalte dort direkt die Premierschlüsselspalte ist, auf die verwiesen wird. Die Ausgangsspalte sowie die Zielspalte, oder, auch besser gesagt die Fremdschlüsselspalte und die Premierschlüsselspalte müssen exakt denselben Datentyp aufweisen, sonst kann eine Beziehung nicht erzeugt werden. Zusätzlich können Sie gewisse kaskadierende Änderungen definieren, z.B. "ON UPDATE CASCADE" über den entsprechenden Zusatz. Wenn Sie kaskadierende Änderungen zulassen, kann der Inhalt der referenzierten Spalte geändert werden, alle Referenzierungen werden entsprechend angepasst. Wenn ein Fremdschlüssel in dieser Form aktiv ist, können in der Detailtabelle nur Datensätze eingetragen werden, die diesen Referenzierungen entsprechen. Mit anderen Worten: Es muss das Kürzel, das hier eingegeben wird, in der anderen Tabelle enthalten sein.

SQL Grundkurs 1: Die Sprache erlernen

Arbeiten Sie sich in die Grundlagen der Datenbanksprache SQL am Beispiel von Microsoft SQL Server, Oracle und MySQL ein und lassen Sie sich die praktische Nutzung erklären.

14 Std. 40 min (112 Videos)
Derzeit sind keine Feedbacks vorhanden...

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!