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 16: Ändern nicht möglich – Neuanlage und Löschen

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
Eine Firma ist verkauft worden und bekommt einen neuen Firmennamen. Die neue Firma soll mit einer neuen Lieferantennummer versehen werden. Allerdings ist eine Änderung der Lieferantennummer aufgrund der referenziellen Integrität nicht möglich.

Transkript

In diesem Beispiel möchte ich mit Ihnen ein Szenario üben, das in der Praxis ab und zu vorkommen kann. Wir können Daten zum Beispiel nicht ändern oder löschen, aufgrund von referenziellen Integritäten. Dazu müssen dann unter Umständen zuerst neue Daten eingefügt werden, Einträge auf diese neuen Daten sozusagen umgehängt werden, damit die alten Daten dann frei von referenziellen Beziehungen sind und gelöscht werden können. Das möchten wir mit folgendem kleinen Szenario umsetzen. Einer der Lieferanten, in dem Fall die Firma "Eisenstumpel Metallwaren OEG" ist verkauft worden, und bekommt einen neuen Eigentümer, damit einen neuen Firmennamen und aus bestimmten Gründen soll die alte Lieferantennummer nicht beibehalten werden, sondern eine neue Lieferantenummer für diesen vergeben werden. Jetzt wäre natürlich die einfachste Sache, wenn man sagt, man macht ein Update auf den Lieferanten, ändere Lieferantennummer und Firmenbezeichnung. Leider lässt das die referenzielle Integrität, da sie in diesen Fällen ohne Aktualisierungsweitergabe festgelegt worden ist, nicht zu. In einigen Tabellen kommen eben Lieferantennummer vor, zum Beispiel in einer Artikeltabelle, bei Bestellungen oder auch beim Wareneingang. Wir erfassen den neuen Lieferanten neu mit der neuen Lieferantennummer, machen danach ein Update auf die benannten Artikelbestellungen und Wareneingang, um sozusagen die alte Lieferantenummer durch die neue zu ersetzen, und danach zum Abschluss können wir erst den alten Lieferanten und den alten Eintrag in der Tabelle löschen. Bei der Neuanlage des neuen Lieferanten möchten wir bestimmte Dinge natürlich übernehmen. wie zum Beispiel die Adresse ist gleich geblieben, auch die Telefonnummer. Auch natürlich Ansprechpartner, E-Mail-Adresse und auch die Webadresse ändert sich, weil die neue Firma unter einer neuen Domäne firmiert. Vielleicht macht es auch Sinn, bei den Bemerkungen in der Spalte "Hinweis" zu ergänzen, dass diese neue Firma eben die Nachfolgefirma von der Firma "Eisenstempel" ist in dieser Spalte hier hinten. Das heißt, wir müssen also folgende Schritte erledigen: einen neuen Lieferanten anlegen, wobei bestimmte Werte vom alten übernommen werden sollen über ein entsprechendes Select. Die Lieferantennummer vergeben Sie entweder manuell neu, indem Sie vorher kontrollieren, was die höchste Lieferantennummer ist und eine höhere verwenden, oder, die elegantere Variante wäre natürlich, beim Einfügen direkt über eine Unterabfrage diese nächste freie Lieferantennummer zu eruieren. Wenn der neue Lieferant eingefügt worden ist, können bei Artikelbestellungen und Wareneingang die Lieferantennummer auf die neue Nummer geändert werden. Zum Abschluss ist dann noch der nun frei gewordene Eintrag der Firma "Eisenstumpel & Co Metallwaren OEG" zu löschen. Diese verwendet die Lieferantennummer "1002". (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 hier die Lösung zuerst mit dem Microsoft SQL Server. Hier haben wir den Lieferanten, der ersetzt werden soll. Wir sehen, dass wir sowohl in der Artikeltabelle als auch bei den Bestellungen als auch bei den Wareneingängen diese Lieferantennummer in Verwendung haben. Deshalb muss wie erwähnt dies zuerst bereinigt werden. Ich starte hier beim SQL Server eine explizite Transaktion und hier sehen wir das entsprechende "INSERT"-Kommando, mit dem wir den neuen Lieferanten anlegen. "INSERT INTO wawi.lieferanten (liefnr, frima1)". Den Firmennamen konnten wir uns ja frei auswählen, ich habe jetzt zum Beispiel "MM Metal Goods AG" verwendet. Und hab als neue Domäne hier "mm-metalgoods.com" verwendet und die "Maria Metall" als Ansprechpartnerin definiert. Über diese "SELECT"-Anweisung lesen wir die alten Daten aus und fügen sie ein. Ich führe jetzt diese "SELECT"-Anweisung ohne das "INSERT" aus, dann sehen wir, was wir einfügen würden. Über diese Unterabfrage lesen wir die höchste vorhandene Lieferantennummer aus und erhöhen sie um "1", das wäre quasi die neue Lieferantennummer die für den neuen Lieferanten vergeben wird. Alle Spalten, wie Straße, Länderkennzeichen, Postleitzahl, Ort, Telefonnummer und so weiter, lesen wir dabei aus. Wir ersetzen nun die identen Werte und für den "Hinweis" hier in der letzten Spalte ich scrolle hier mal hinüber, dass wir das sehen, in die Spalte "Hinweis" fügen wir den fixen Text "Nachfolger von Eisenstümpel & Co Metallwaren OEG" und die alte Lieferantennummer hinzu. Mit dieser Anweisung fügen wir nun den Warenlieferanten ein, indem wir sie komplett inklusive des "INSERT" ausführen. Eine Zeile darüber ist die Meldung und wir kontrollieren hier kurz einmal, ob die Zeilen so, wie wir es wollten, vorhanden sind. Ja, das sieht gut aus. Die neue Zeile ist erfasst. Jetzt sehen wir, dass als Lieferantennummer "2007" vergeben wird. Diese tragen wir nun hier ein. Ich habe hier etwas anderes vorbereitet, das macht aber nichts. Ich tausche den Wert hier aus und mache jetzt einerseits ein Update auf die Artikel, um die Lieferantennummer auszutauschen, das waren 26 Zeilen. Das Gleiche mache ich für die Bestellungen. Hier ist ja die Spalte "Lieferant", hier heißt sie nur "lief", da muss man immer aufpassen auf den entsprechenden Spaltennamen und Wareneingang, da habe ich dieselben Spaltennamen, wie wir sie bei den Bestellungen hatten. Nun ist sozusagen diese alte Lieferantennummer frei, weil alle referenzierenden Einträge hier die neue Lieferantennummer aufweisen, und daher kann ich nun mit dieser Delete-Anweisung problemlos abschließen und diesen Datensatz löschen. Damit sind nun alle Änderungen wie gewünscht vorgenommen, und alle vorhandenen Artikel zum Beispiel laufen nun bereits auf den neuen Lieferanten. Wenn das passt, schließen wir das Ganze mit einem "COMMIT" ab. Analog funktioniert das Ganze unter MySQL Auch hier lesen wir die entsprechenden Werte aus und fügen sie ein. Auch hier habe ich dieselbe Unterabfrage, also ist diese Anweisung hier in identer Form vorhanden. Ich sehe, sie wurde auch eingefügt und hier natürlich auch diese kontrollierende Anweisung. Wir sehen, mit dieser Nummer und auch hier mache ich mit derselben Nummer nun die Updates. Und auch letztendlich das "DELETE". Ich mache das erste Löschen der ersten Anweisung, ich führe das zweite Löschen und den letzten Löschvorgang aus und nun kann das Löschen dieses Lieferanten erfolgen. Und wir sehen, diese eine Zeile ist nun entfernt, da alle umgehängt worden sind. Auch unter Oracle finden wir die identen Lösungsschritte vor. Auf eine Sache möchte ich jetzt hier hinweisen. Da ist natürlich etwas dabei, was ein wenig tricky ist. Und zwar dieses '&' hier, würde man gar nicht meinen, dass das ein Problem darstellen könnte, und zwar Folgendes: Mit '&' und einem nachfolgendem Text können Oracle SQL Editoren dynamische Texte definieren, die danach beim Einfügen ausgetauscht werden. Achten Sie jetzt darauf, wenn ich diese Anweisung einfach so ausführe, wie ich sie eins zu eins vorhin unter MySQL und Oracle ausgeführt habe, starte ich es und bekomme jetzt hier diese Meldung "Substitutionsvariable eingeben", und zwar "CO". Er glaubt jetzt, "CO" sei die Variable beim Leerzeichen, weil hier ein "&" steht. Und würde ich jetzt hier einen Text eingeben "Hallo" zum Beispiel, würde eingefügt werden "Nachfolger von Eisenstumpel Hallo Metallwaren". Und das wollen wir natürlich nicht. Ich breche hier ab und mache das Ganze jetzt hier mit einem "ROLLBACK" sicherheitshalber noch rückgängig. Damit ich das Verhalten des Editors sozusagen deaktiviere, verwende ich deshalb hier vorweg, bevor ich die Anweisungen ausführe, diese Anweisung "SET DEFINE OFF", damit wird das Definieren von diesen Substitutionsvariablen deaktiviert. Ich starte diese Anweisung und nun danach wird diese Zeile ganz normal eingefügt, so wie wir es wollen. Wir sehen hier, sie ist drin und wir können alles andere weiter so ausführen, wie wir es auch bei den beiden anderen Systemen gesehen haben. Also kann es in der Praxis oft notwendig sein, bevor wir Daten löschen können, neue hinzuzufügen und Zuordnungen aufzuheben. Unterschätzen sie also nie die referenzielle Integrität.

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!