Unsere Datenschutzrichtlinie wird in Kürze aktualisiert. Bitte sehen Sie sich die Vorschau an.

SQL Grundkurs 1: Die Sprache erlernen

Einfügen mit Auto-Inkrement - Oracle

Testen Sie unsere 2019 Kurse

10 Tage kostenlos!

Jetzt testen Alle Abonnements anzeigen
Oracle verwendet eine SEQUENCE, um automatisch fortlaufende Werte zu generieren. Dieser "Nummernspender" ist aber nicht fix an eine Spalte gebunden, sondern kann losgelöst verwendet werden. Lernen Sie mehr über den Umgang mit einer SEQUENCE in diesem Video.

Transkript

In diesem Video sehen Sie, wie Sie ein AutoIncrement bei Oracle verwenden. Bei Oracle ist die Logik für ein AutoIncrement anders implementiert als bei anderen Datenbankmanagement-Systemen. Es gibt hier keine Eigenschaft oder Definition, die man fix an einer Spalte, einer Tabelle definieren kann und damit festlegt, dass diese automatisch hochgezählt wird. Dafür gibt es stattdessen einen eigenen Objekttyp eine sogenannte "Sequence", eine Sequenz. Eine Sequenz kann man sich vorstellen, das ist ein eigenes Objekt, wie ein Nummernspender, das heißt, jedesmal beim Einfügen eines Datensatzes muss man sich quasi von diesem Nummernspender, also dieser "Sequence" eine Nummer holen und diese beim Einfügen verwenden. Diese "Sequence" ist damit ein eigenständiges Objekt und nicht an eine fixe Spalte gebunden, das heißt, man hat keine Möglichkeit zu definieren, dass eine "Sequence" z.B. nur zum Befüllen der Bestellnummern in der Bestellung verwendet wird. Dafür könnte man, wenn man das benötigt, eine "Sequence" auch für mehrere Spalten verwenden. Eine "Sequence" wird in Oracle mit der Anweisung "CREATE SEQUENCE" erzeugt. Diese hat verschiedene Parameter, z.B. "MinValue", der niedrigste Wert; "MaxValue", der höchste Wert; "IncrementBy", damit lege ich quasi die Schrittweite fest, in welchen Abständen die neuen Nummern vergeben werden; "StartWith" legt mir den Startwert fest; "Cache20" heißt, dass quasi 20 Nummern immer in den Cache geholt werden, d.h. in 20er-Paketen werden Nummern aus diesem Nummernspender gezogen, um schneller verfügbar zu sein. Nachteil des Caches ist, wenn der Server neu gestartet werden muss, wird der Cache, der im RAM sich befindet ausgeleert und die Nummern fehlen. Vorteil ist hingegen, dass natürlich der Zugriff wesentlich schneller ist; "NoCycle" bedeutet, dass wenn der "MaxValue" erreicht ist, die Sequenz keine Nummern mehr bereitstellt; mit "Cycle" würde wieder beim Startwert beginnen. Wenn Sie sich fragen, ist das nicht redundant hier? "MinValue" 1000 und Startwert 1000, was ist der Unterschied? Eigentlich, genauer genommen, brauchen wir in diesem Beispiel hier den "MinValue" nicht. Der "MinValue" ist quasi das Gegenstück zum "MaxValue", falls es ein negatives Inkrement gibt. Man könnte eine "Sequence" ja auch so definieren, dass sie von einer Zahl ausgehend hinunterzählt bis zu irgendeinem bestimmten Wert, oder sie kann auch einen negativen Wert zurückliefern, dann könnte man den "MinValue" benötigen. Für uns reicht der Startwert, da unsere Bestellnummer vierstellig sein soll. Ich erzeuge jetzt schnell diese "Sequence", die habe ich jetzt hier angelegt, aktualisiere die Anzeige, und damit sehe ich es jetzt. Wie verwendet man nun so eine "Sequence"? Mit der Option "NextVal" rufe ich ihm einen neuen Wert ab. Ich mache das jetzt einfach hier einmal im Trockentraining mit einem "SELECT", indem ich sage "SELECT WAWI.", in dem Fall "Bestellnummer", habe ich die "Sequence" genannt und verwende hier die Methode "NextVal". Bei Oracle muss ich ja immer "FromDual" angeben, wenn ich einen Wert direkt abrufe. Damit würde ich in dem Fall den ersten Wert aus der "Sequence", und in weiterer Folge, natürlich immer den nächsten Wert abrufen. Um nachträglich feststellen zu können, welchen Wert ich abgerufen habe, kann ich auch die Funktion "CurrentValue" definieren. Mit "CurrentValue" kriege ich immer den zuletzt innerhalb meiner Session abgerufenen Wert, d.h. der gilt nur für mich. Wenn mehrere Leute in einer Multi-User-Umgebung gleichzeitig diese "Sequence" verwenden und andere Nummern schon abgerufen haben, dann beeinflusst das dieses Ergebnis nicht. Das können wir daran erkennen, wenn ich diese Anweisung ausführe in meiner Session, bevor ich einmal "NextVal" verwende. Ich starte jetzt einmal "CurrentValue" und Sie sehen, wir bekommen hier eine Fehlermeldung: "Sequence CurrentValue is not yet defined in this session." Weil ich noch nie etwas abgerufen habe, kann er mir auch nicht sagen, was ich als Letztes abgerufen habe, in dieser Session. Also rufe ich jetzt einmal erstmals einen Wert ab, indem ich die obere Anweisung ausführe, und jetzt sehen wir "1000", das heißt das war unser Startwert. Und jedes Mal, wenn ich diese Anweisung erneut ausführe, bekomme ich den nächst höheren Wert. Die Werte "1000" bis "1004" habe ich jetzt aus dieser "Sequence" sozusagen verbraucht. Die kann ich jetzt nicht mehr dazu verwenden, um in einen Datensatz diese Nummer einzufügen. Aber, ich kann jetzt mit "CurrentValue", nachdem ich in meiner Session hier schon einmal etwas abgerufen habe, eruieren, was ist der zuletzt abgerufene Wert, und das ist in dem Fall "1004". Diese Anweisung kann ich beliebig oft wiederholen. Da wird ja kein neuer Wert abgerufen, hiermit verbrauche ich keine Werte. Wie fügen wir nun einen Datensatz ein mit einer "Sequence"? Ich würde jetzt genau diese Anweisung "NextVal" in mein Insert-Statement einbauen. "INSERT INTO WAWI.Bestellungen", nehmen die Bestellnummer, die müssen wir natürlich explizit befüllen, das Bestelldatum, wir nehmen den Lieferanten und wir nehmen den Bearbeiter. Ich denke, ich werde auch hier den Status mit einem Default-Wert belegt haben, deshalb kann ich den jetzt hier einmal weglassen. "Values", und jetzt kopiere ich mir 1:1 diese Anweisung hier in mein Insert-Statement, d.h damit wird beim Einfügen der nächste Wert abgerufen. "Bestelldatum" nehme ich den 10/08/2011, ich nehme hier das Standardformat, das momentan in meiner Session gültig ist für Datumswerte, damit ich nicht explizit konvertieren muss. "Lieferantennummer" nehme ich "1002", und als Bearbeiter nehme ich "452". Wenn ich es richtig im Kopf habe, sind das gültige Werte für den Fremdschlüssel. Ich muss nur jetzt etwas aufpassen. Wir haben jetzt hier eine neue "Sequence" erzeugt, und der nächste Wert wäre "1005". Wenn wir kurz einen Blick in die Tabelle werfen, dann werden wir sehen, dass diese Nummer schon vergeben ist. Da habe ich jetzt das Falsche kopiert. "Tabellennamen", den wollte ich mir hier kopieren. Und nun sehen wir nach: Was gibt es jetzt hier in der Tabelle? Das heißt bis zur Nummer "1007" sind sie eigentlich schon vergeben. Deshalb würde ich jetzt natürlich einen Fehler bekommen, wenn ich es einfüge, das heißt, ich werde jetzt vorher einmal hier meine "Sequence" so lange mit einem neuen Wert "leeren" sozusagen, damit dann der nächste freie Wert kommt. "1007" habe ich verbraucht, d.h. wenn ich jetzt dieses Insert-Statement hier ausführe, dann wird "1008" als nächste Nummer vergeben werden. Nun habe ich hier doch etwas übersehen, nämlich es gibt eine Spalte, in die wir noch etwas einfügen müssen. Das ist die Spalte "Status". Was ist aber außerdem jetzt dabei passiert? Ich habe jetzt einerseits den Wert "1008" hier abgerufen. Diese Anweisung hat fehlgeschlagen. Ich kann jetzt natürlich den Fehler hier ausbessern und ich sage "Status" ergänze ich hier und ergänze hier für "Status" einen fixen Wert "1". Durch diesen Fehler habe ich aber jetzt die Nummer "1008" verbraucht, d.h. ich habe jetzt zwar den Fehler ausgebessert, aber, wenn ich diese Anweisung jetzt noch einmal starte, jetzt ist diese Zeile eingefügt worden, da dürfen Sie sich hier nicht erschrecken, Oracle löscht hier die alte Fehlermeldung nicht heraus, sondern schreibt den Text hier dazu. Jetzt ist der Fehler nicht noch einmal aufgetreten, sondern Sie sehen hier, eine Zeile ist eingefügt worden. Wenn Sie das irritiert, können Sie hier mit diesem Radiergummi-Symbol die alte Ausgabe hier löschen und entfernen. Betrachten wir jetzt das Ergebnis in der Tabelle, dann sehen wir, dass die Bestellung mit der Nummer "1008" nicht existent ist. Wir haben die nächste Nummer "1009" vergeben. Dadurch, dass wir aber ohnehin die Bestellnummer immer explizit eingegeben werden muss und dieses AutoIncrement nicht an die Spalte gebunden ist, könnten wir in so einem Fall natürlich jederzeit manuell die Nummer "1008" direkt ohne Probleme in diese Tabelle einfügen, um diese Lücke wieder zu schließen. Sie haben in diesem Video gesehen, dass Oracle AutoIncremente über sogenannte "Sequences" implementiert hat. "Sequences" sind Nummernspender, die uns eine Nummer zur Verfügung stellen. Diese Nummer wird über die Methode "NextVal" abgerufen und beim Insert-Statement direkt mit angegeben. Eine einmal abgerufene Nummer aus der "Sequence" ist verbraucht und wird nicht noch einmal vergeben. Schlägt das "Insert" fehl, ist diese Nummer also ebenso verbraucht. Da aber die Spalte ja keinerlei Einschränkungen unterliegt, können Sie natürlich jederzeit explizit bestimmte Nummern auch in diese Spalte manuell selber eintragen.

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!