Am 14. September 2017 haben wir eine überarbeitete Fassung unserer Datenschutzrichtlinie veröffentlicht. Wenn Sie video2brain.com weiterhin nutzen, erklären Sie sich mit diesem überarbeiteten Dokument einverstanden. Bitte lesen Sie es deshalb sorgfältig durch.

SQL Grundkurs 2: Aufgaben und Lösungen

Beispiel 4: Spalte und Fremdschlüssel ergänzen

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
Erstellen Sie eine Tabelle wawi.zahlarten und fügen Sie vier Zahlarten ein. Ergänzen Sie eine neue Fremdschlüsselspalte in der Tabelle wawi.rechnungen, um jeder Rechnung eine Zahlart zuordnen zu können.

Transkript

Um das Üben von koordinierten Vorgängen geht es in diesem vierten Beispiel zum Thema "DDL" das ich Ihnen in diesem Film zeigen möchte. Worum geht es? Wir haben bereits eine Tabelle "Rechnungen" erstellt und wollen nun eine neue Tabelle erstellen, die verschiedene Zahlarten enthält. Diese Zahlarttabelle ist sehr einfach, die hat nur eine ID, zum Beispiel "ZANR" für "Zahlartnummer" habe ich es genannt, und eine "BEZEICHNUNG". Ich habe hier auch schon diese vier Werte eingefügt, "B" für "Barzahlung", "EC" für "EC-Zahlung","K" für "Kreditkarte" und Sie sehen, ich bin schon sehr fortschrittlich, "AP" für "Apple Pay" auch wenn es zum Zeitpunkt der Aufnahme dieses Videos in Europa noch gar nicht gibt, aber vielleicht gibt es das einmal, und wenn Sie dieses Beispiel üben, haben Sie vielleicht mittlerweile schon mit Apple Pay bezahlt. Nachdem wir nun diese Tabelle erstellt haben, ist der zweite Schritt, dass Sie eine Fremdschlüssel-Spalte in der Tabelle "Rechnungen" ergänzen, die genau auf diese Zahlartnummer verweist. Sie können diese zum Beispiel "Zahlart" nennen. Nur auf eine Sache müssen Sie besonders Acht nehmen, In der Rechnungstabelle gibt es schon Einträge. Diese Zahlart soll als "NOT NULL" definiert werden, obwohl es schon Einträge gibt. Das wird nicht so einfach funktionieren. Als Tipp: Sie müssen sie ursprünglich einmal als nullable ergänzen, danach mit einem Update mit Werten versorgen und erst anschließend als "NOT NULL" definieren. Das Ganze müssen Sie machen, bevor Sie den Fremdschlüssel ergänzen, denn wenn ein Fremdschlüssel schon ergänzt ist, können Sie vielfach keine Änderungen mehr in der Spalte vornehmen. Mit diesen Tipps ausgestattet sollte das Umsetzen dieses Beispiels eigentlich kein Problem sein. (Musik läuft) Pausieren Sie nun das Video und lösen Sie die Aufgabe. Wenn Sie damit fertig sind, fahren Sie mit dem Video fort und sehen Sie sich meine Musterlösung an. Betrachten wir uns nun die Lösung für Beispiel vier gemeinsam beginnend mit Oracle. Der erste Schritt ist es einmal, die Tabelle "Zahlarten" zu erstellen. Dies ist sehr einfach, die hat zwei Spalten eine "ZANR", die ich als "varchar2" definiert habe mit einer Länge von zwei Zeichen und einer "bezeichnung", die mit 20 Zeichen auskommt. Diese Zahlartnummer habe ich auch als Primärschlüssel festgelegt, und damit eine Bezeichnung erfasst werden muss, "NOT NULL" für diese Spalte definiert. Ich habe jetzt hier die vereinfachte Form genommen, könnte natürlich bei Oracle hier wieder schreiben: "CONSTRAINT nn _zahlarten_bezeichnung" vor dem "NOT NULL", um das mit einem sauberen Constraint-Namen zu versehen. Ich führe die Anweisung aus und habe hier vergessen, offensichtlich diesen vorweg zu löschen. Das mache ich noch einmal schnell. Ich lösche diese Tabelle, bevor ich sie jetzt hier noch einmal erzeuge. Und nun hier die Insert-Statements, um diese vier Zahlarten "Barzahlung", "EC-Karte", "Kreditkarte" und "Apple Pay" einzufügen. Damit diese endgültig sind, bestätige ich die Eingabe mit einem "COMMIT" und betrachte mir nun den Inhalt. Das passt soweit. Jetzt kommt es nach diesem ersten Teilschritt zum zweiten, nämlich zum Ergänzen der Spalte. Ich habe Ihnen ja vorweg gesagt, passen Sie auf, es ist ein Problem, mit einer Tabelle, wenn Sie eine Spalte ergänzen. als "NOT NULL" und diese Tabelle enthält gleich Datensätze. Das heißt, versuchen Sie das mit dieser Anweisung, "ALTER TABLE", "ADD", "zahlart" mit dem Datentyp "varchar2(2)", Das muss natürlich für den zukünftigen Fremdschlüssel derselbe Datentyp sein, den wir hier für den Primärschlüssel vergeben haben, und definieren als "NOT NULL", dann erhalten wir einen Fehler. Die Tabelle muss leer sein, wenn Sie eine verpflichtende Spalte ergänzen wollen. Das funktioniert also nicht. Was ist also die Lösung? Wir ergänzen vorläufig einmal diese Spalte "zahlart" ohne sie als "NOT NULL" zu definieren mit "ALTER TABLE", "ADD" und fügen die neue Spalte hinzu. Das hat jetzt einmal funktioniert. Nun versorgen wir sie mit einem gültigen Wert. Auch wenn es den Fremdschlüssel ja noch nicht gibt, und wir jeden Wert verwenden könnten, verwende ich natürlich einen, der gültig sein wird, und deshalb verwende ich die Zahlart "B" für "Barverkauf". Und mit diesem Update habe ich jetzt sozusagen vorhandene Werte aktualisiert, in unserem Fall ist es nur eine Zeile, die sich in dieser Tabelle befindet. Nachdem jetzt alle Zeilen einen Wert haben, kann ich jetzt in einem zweiten Schritt einer Spalte einen NOT NULL Constraint ergänzen oder das auf "NOT NULL" ändern. Das machen wir bei Oracle mit der Anweisung "ALTER TABLE", Name der Tabelle, "MODIFY". "MODIFY" und dann geben wir den Namen der Spalte "zahlart", müssen denselben Datentyp wieder angeben, würde ich das weglassen hätten wir einen Fehler beziehungsweise ich würde hier einen anderen Datentyp angeben, um den zu ändern, und jetzt ergänze ich das, was noch gefehlt hat, nämlich dass diese Zahlart als "NOT NULL" definiert werden soll. Ich führe diese Anweisung aus und nun habe ich die zukünftige Fremdschlüsselspalte als "NOT NULL"-Spalte definiert. Das kann ich hier jetzt natürlich auch kontrollieren, indem ich jetzt hier mal die Anzeige aktualisiere und ich schaue mir jetzt hier die Struktur meiner Rechnung an. Dann sehen wir hier bei "ZAHLART", dass bei "NULLABLE" hier "NO" drinsteht. Das heißt, das hat sauber funktioniert. Und jetzt brauchen wir nur noch den Fremdschlüssel ergänzen, so wie wir es schon ein paar Mal gemacht haben, "ALTER TABLE", "ADD CONSTRAINT" Name des Constraints, Typ, die betroffene Spalte und beim Fremdschlüssel, auf welche Spalte er verweist. Und damit haben wir unsere Aufgabenstellung sauber erledigt. Als kleinen Hinweis noch, wie ich einen solchen Constraint wieder löschen könnte. Ich bräuchte zum Beispiel die Anweisung "ALTER TABLE", "DROP CONSTRAINT", um dieses zu entfernen. Da sehen sie, warum es so wichtig ist, einen sauberen Constraint-Namen zu verwenden. Denn hier benötige ich diesen Namen. Hätte ich den jetzt hier nicht vergeben, hätte ich gerade bei Oracle einen "SYSC" mit einer laufenden Nummer, und müsste erst einmal eruieren, wie dieses Constraint heißt. Aber mit dieser Anweisung könnte ich jetzt das Ganze wieder rückgängig machen. Schauen wir uns nun das Ganze vergleichend bei den anderen Systemen an. Ich wechsle jetzt hier einmal zu MySQL. Auch hier erzeuge ich die Tabelle "Zahlarten", die Zahlartnummer, gleicher Datentyp "varchar2", hier mit einer Bezeichnung 20 Zeichen als "NOT NULL" und den Constraint, dass ich hier auf Tabellenebene für den Primärschlüssel definiere. Ich führe diese Anweisung aus, blende den unteren Teil ein dass wir sehen "CREATE TABLE wawi.zahlarten", und es hat funktioniert. Mit einer Anweisung kann ich das hier erledigen und füge diese vier Zeilen ein. Die Form ist sehr praktisch, ich bin ein richtiger Fan von dieser Einfügemethode Ich führe die Anweisung aus, habe jetzt vier Zeilen eingefügt, bestätige das Einfügen und kontrolliere gleich das Ergebnis, indem ich mit einem "SELECT" hier schnell ausgebe, "SELECT * FROM wawi.zahlarten". Da sehen wir jetzt, dass diese vier Zahlarten in der Tabelle tatsächlich vorgefunden werden. Und jetzt geht es wieder darum, wie wir jetzt einfügen können. Jetzt gibt es hier einen Sonderfall unter MySQL auch wenn Sie es gar nicht so recht glauben, es ist sogar möglich, wenn es bei einer Tabelle schon Einträge gibt, eine "NOT NULL"-Spalte hinzuzufügen. Das heißt, das was früher hier nicht funktioniert hat mit dem Zusatz "NOT NULL", funktioniert jetzt hier sogar. Ich führe diese Anweisung einmal aus. Sie sehen, das hat funktioniert. Was ist aber jetzt weniger ideal? Ich habe auch darüber- geschrieben "nicht so ideal". Schauen wir uns das Ergebnis in der Tabelle "Rechnungen" an. Da ist jetzt hier, weil ein "NOT NULL"-Wert hier nicht möglich ist, ein Leerstring eingefügt worden. Das heißt hier steht nicht "NULL" drin, das würden wir hier im Editor sehen, sondern wirklich ein Leerstring. Das heißt, es werden, in SQL ausgedrückt, zwei einfache Hochkomma direkt hintereinander. Die würden später vielleicht beim Erzeugen des Fremdschlüssels, weil es ja die Zahlart "Leerstring" nicht gibt, wiederum zu einem Problem führen, deshalb geht das zwar so, aber es ist nicht so ideal und deshalb lösche ich diese falsch angefügt Spalte gleich wieder und zeige Ihnen, wie hier die saubere Vorgangsweise wäre. Die ähnelt eigentlich dem, was wir jetzt gerade unter Oracle gesehen haben. Ich füge diese Spalte einmal als "NULLABLE" also ohne den Zusatz "NOT NULL" ein, damit ist sie jetzt einmal in der Tabelle enthalten. Mit diesem Update schreibe ich einen gültigen Wert in alle Zeilen hinein, in dem Fall ist es nur eine, um sie anschließend jetzt hier als "NOT NULL" zu definieren. Der Editor meldet hier jetzt zwar einen vermeintlichen Fehler, und meckert hier, dass diese Form nicht passt, aber Sie sehen, es ist die gleiche Syntax, prinzipiell wie wir sie bei Oracle gesehen haben. mit "ALTER TABLE", Name der Tabelle, "MODIFY", den Namen der Spalte, den Datentyp und dann zusätzlich "NOT NULL", damit ändern wir, dass diese Spalte nun keine NULL-Werte mehr enthalten darf. Ich führe die Anweisung aus, es hat funktioniert und jetzt nachdem ich das gemacht habe und auch einen gültigen Wert drinstehen habe, ergänze ich als letzten Schritt den Fremdschlüssel über die bekannte Syntax. Die gleicht wieder der Syntax, wie wir sie beim Oracle kennengelernt haben. Um das Ganze rückgängig zu machen, hier eine kleine abweichende Syntax, nämlich anders als bei Oracle oder, wie wir es auch gleich beim Microsoft SQL Server kennenlernen, löschen wir ein Constraint nicht allgemein mit der Form "ALTER TABLE", "DROP CONSTRAINT", sondern der Constraint-Typ wird hier angegeben. Das heißt, statt Constraint, Name des Constraints müssen wir schreiben "DROP FOREIGN KEY", also Fremdschlüssel, dann gefolgt vom Namen des Constraints. Das ist eine kleine Abweichung hier, die Spalte selber löschen wir wieder mit "DROP COLUMN" und die Zahlarttabelle auf diese Art und Weise Also da gibt es keinen großen Unterschied. Zum Abschluss noch die Lösung mit dem Microsoft SQL Server, hier haben wir die gleiche Ausgangssituation. Wo gibt es hier Unterschiede? Sie sehen, das Erstellen der Tabelle ist einmal so, wie wir es bereits kennen, die Datentypen werden zugeordnet, der Primärschlüssel definiert – soweit kein Unterschied. Auch das Einfügen der Anweisung kann ich mit Copy & Paste vom MySQL-Editor übernehmen, um mir diese Werte einzufügen. Auch hier die Kontrolle mit der entsprechenden Anweisung, dass diese vier Werte eingetragen sind. Nachdem ich hier automatische Transaktionen aktiv habe, brauche ich kein "COMMIT". Die Daten sind schon festgeschrieben. Hier das gleiche Problem, das wir schon bei Oracle gesehen haben, wenn ich jetzt hier diese Spalte als "NOT NULL" hinzufüge, egal ob ich jetzt hier mit einer Anweisung versuche, auch schon den Fremdschlüssel zu erzeugen oder nicht, "NOT NULL" wird ein Problem. Wenn ich das ausführe, bekomme ich eine Fehlermeldung. Ich kann keine Spalte hinzufügen mit NOT NULL Werten, die keinen Standardwert hat. Also ich könnte jetzt eigentlich einen Standardwert hinzufügen. Wenn ich das nicht möchte, dann löse ich es korrekt, wie wir es bei Oracle gesehen haben, ich füge die Spalte zuerst hinzu ohne sie als "NOT NULL" zu definieren, update die Zahlart, da verwende ich jetzt kurz "STRG + Shift + R", um den Cache vom IntelliSense zu aktualisieren, damit die rote Wellenlinie hier verschwindet, update den Inhalt der Spalte auf "B" und jetzt nachträglich mit "ALTER COLUMN" ändere ich es auf "NOT NULL". Da haben wir jetzt einen kleinen Unterschied, Bei Oracle und MySQL hatten wir "ALTE TABLE", Name der Tabelle und dann "MODIFY". Beim Microsoft SQL Server müssen Sie "MODIFY" durch "ALTER COLUMN" ergänzen. Also um meine Spalte zu ändern, "ALTER TABLE", gefolgt von "ALTER COLUMN", sonst ist es gleich. Der Name der Spalte, der neue Datentyp, wenn es der gleiche ist, muss wieder der gleiche geschrieben werden, und "NOT NULL", um NOT NULL zu ergänzen. Damit habe ich diese Spalte als "NOT NULL" definiert. Würde ich dasselbe ohne "NOT NULL" ausführen, würde ich das NOT NULL ja wieder auf diese Art und Weise entfernen. Abschließend könne wir jetzt auch hier, den Fremdschlüssel ergänzen, und haben damit das Beispiel abgeschlossen. Wir haben also gesehen, wir müssen darauf achten, wenn wir neue Spalten einer Tabelle hinzufügen, die als "NOT NULL" definiert sind, da müssen wir Vorsorge treffen, wenn diese Tabelle bereits Daten enthält. Entweder müssen wir beim Anfügen der neuen Spalte schon einen Defaultwert definieren oder wir definieren die Spalte vorläufig als "NULLABLE", befüllen die Spalte und ändern sie nachher in "NOT NULL". Diese Vorgangsweise ist die zu empfehlende. Wenn Sie eine bestehende Spalte ändern, verwenden Sie beim Oracle und MySQL "ALTER TABLE", "MODIFY", beim Microsoft SQL Server "ALTER TABLE", "ALTER COLUMN". Das Löschen eines Constraints funktioniert bei Oracle und beim Microsoft SQL Server über die Anweisung "DROP CONSTRAINT", gefolgt vom Namen. Bei einem Fremdschlüssel bei MySQL müssen wir angeben "DROP FOREIGN KEY". Das Löschen der Spalten passiert einheitlich über die Anweisung "DROP COLUMN".

SQL Grundkurs 2: Aufgaben und Lösungen

Vertiefen Sie Ihre SQL-Kenntnisse. In diesem Workshop erhalten Sie zahlreiche Beispielaufgaben, die Sie selbst lösen können. Anschließend zeigt Ihnen der Trainer die Lösung.

7 Std. 41 min (61 Videos)
Derzeit sind keine Feedbacks vorhanden...
 

Dieses Training setzt SQL-Kenntnisse voraus, wie sie beispielsweise in „SQL lernen und anwenden“ vermittelt werden.

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!