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 1: Die Sprache erlernen

Einfügen mit Auto-Inkrement - SQL Server

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
Ist beim MS SQL Server eine Spalte als IDENTITY für eine automatische Nummerierung definiert, so wird deren Inhalt beim Einfügen eines neuen Datensatzes vom System vergeben. Wie Sie mit dieser Spalte in einem INSERT-Statement umgehen, zeigt Ihnen dieses Video. Sie sehen aber auch, wie Sie das Heft an sich reißen und ausnahmsweise selber einen Wert in solch eine Spalte eintragen können.

Transkript

In diesem Video zeige ich Ihnen, wie Sie beim Microsoft SQL-Server in eine Tabelle Datensätze einfügen, wenn für eine Spalte ein "AutoIncrement" definiert worden ist. Ein "AutoIncrement" wird beim Microsoft SQL-Server auch als "Identity" bezeichnet, bedeutet, dass in dieser Spalte der neue Wert beim Einfügen eines neuen Datensatzes automatisch als nächsthöherer Wert definiert wird. In der Tabelle "Bestellungen" haben wir momentan diese Datensätze, und für die Spalte "Bestellnummer" ist so eine "Identity" definiert. Beim Microsoft SQL-Server kann für so eine "Identity"-Spalte, oder auch "Identitätsspalte" genannt, nicht nur ein Startwert, sondern auch ein Inkrement definiert werden, das heißt, ich muss nicht immer bei "1" beginnen, und auch die Schrittweite der neuen Nummern muss nicht immer "1" betragen. Wie gehen wir nun vor, wenn wir in dieser Tabelle einen neuen Datensatz eintragen? Wenn wir diesen Datensatz mit einer Anweisung ohne Zielspaltenangabe einfügen, ignorieren wir diese Identitätsspalte einfach. "InsertInto_Wawi.Bestellungen; normalerweise müssen wir ja, wenn wir die Zielspalten nicht angeben, für jede Spalte einen Wert bereitstellen. Wir haben hier 1, 2, 3, 4, 5, 6 Spalten in der Tabelle, das heißt, wir müssten 6 Werte bereitstellen. In dem Fall stellen wir nur 5 Werte bereit. "Values", und wir beginnen einfach mit der zweiten Spalte "Datum". "Bestellnummer" lasse ich einfach weg. Ich nehme jetzt den 10.August, z.B. 2011 08/10  als "Bestelldatum". Für den "Lieferanten" wähle ich die Lieferantennummer 1002. "Personalnummer" nehme ich 452, eine gültige Nummer. "Bemerkung" gibt es keine, also "NULL". Und "Status" wäre in dem Fall "1" für "neu erfasst". Obwohl ich hier nur 5 Werte eingegeben habe, bekomme ich jetzt keine Fehlermeldung, wenn ich diese Anweisung ausführe, da die Identitätsspalte einfach nur ignoriert werden muss. Sie sehen: Eine Zeile wurde eingefügt. Der Kontrollblick in die Tabelle zeigt mir, dass mit der nächsthöheren Nummer, in dem Fall Bestellnummer 1008, ein neuer Datensatz eingefügt worden ist. Wenn ich einen Datensatz mit Zielspalteneingabe eingebe, kann ich ohnehin diese Spalte weglassen, bzw. ich muss es sogar. Weiters kann ich hier auch jene Spalten weglassen, die einen Standardwert haben. Das "Bestelldatum" ist hier mit einem "Default"-Wert, einem Standardwert belegt, deshalb lasse ich es einfach weg. Ich fange mit dem "Lieferanten" an, weiters gebe ich noch ein den "Bearbeiter", "Bemerkung" brauchen wir keine und auch der "Status" ist mit einem "Default"-Wert belegt; also ist es eigentlich ausreichend, diese zwei Werte zu befüllen. Ich führe diese Anweisung aus, und Sie sehen, ich habe hier wirklich erfolgreich wieder einen Datensatz eingefügt. Ich betrachte das Ergebnis in der Tabelle, und damit haben wir jetzt wieder einen Datensatz erfolgreich eingefügt. Was geschieht nun mit "AutoIncrement"-Werten, wenn ein Einfügevorgang fehlschlägt. Ich provoziere jetzt einen Fehler, indem ich jetzt hier einfach eine z.B. ungültige Lieferantennummer versuche einzutragen, von der ich weiß, dass es sie nicht gibt, weil dann wird aufgrund der Fremdschlüssel-Verletzung hier kein Eintrag erfolgen. Die letzte Nummer, die wir vergeben haben, war die Nummer 1009. Nun führe ich diese Anweisung aus und bekomme hier eine Fehlermeldung, wie erwartet, weil ja die Lieferantennummer ungültig ist. Was passiert ist, ist, dass jetzt die nächste freie Nummer, in dem Fall 1010, abgerufen worden ist, aber aufgrund dessen, dass der Eintrag nicht erfolgreich gewesen ist, ist diese Nummer jetzt verloren gegangen. Wir können das sehen, wenn ich jetzt anschließend noch einmal eine erfolgreiche Anweisung ausführe und jetzt das Ergebnis kontrolliere, dann werden wir sehen, dass wir nun eine Lücke von einer Nummer in unserer Datenbank haben. Sie sehen hier also, dass erfolgte große Einfügevorgänge jeweils eine Nummer verbrauchen. Das bedeutet, dass mir so ein "AutoIncrement" in der Praxis nur Eindeutigkeit, aber keine Lückenlosigkeit garantiert. Das heißt, in der Praxis sollte ich daher ein "AutoIncrement" nicht einsetzen, wenn es keine Lücken in einer Nummerierung so wie zum Beispiel bei einer Rechnungsnummer geben darf. Wie könnte ich nun selber manuell eine Nummer in so eine Spalte eintragen? Wenn ich jetzt versuche, hier manuell explizit einen Wert einzugeben, werde ich eine Fehlermeldung bekommen. Ich versuche das jetzt einmal hier, indem ich in meiner Anweisung zusätzlich noch die Bestellnummer anfüge und auch noch versuche, die von mir vorher unnötig verbrauchte Nummer 1010 einzufügen. Wenn ich diese Anweisung ausführe, bekomme ich eine Fehlermeldung vorweg, dass das nicht möglich ist. Ich kann in eine Identitätsspalte nichts einfügen, solange ich das sozusagen nicht freigebe mit der Anweisung "IdentityInsert", und das mache ich nun. Mit der Anweisung "SetIdentity_Insert (gefolgt vom Namen der Tabelle, in dem Fall) Ware.BestellungenOn", aktiviere ich jetzt für meine Session, dass ich hier Werte einfügen darf. Solange diese Einstellung aktiv ist, kann ich nun versuchen, hier direkt Werte einzutragen, und das Ganze funktioniert auch. Ich habe jetzt hier die vorher fehlende Nummer 1010 nachträglich eingefügt, und das hat auch funktioniert. Kontrollieren wir die Anzeige, und wir sehen, dass diese Lücke sozusagen nachträglich etwas später von mir gestopft worden ist. Was müssen wir berücksichtigen, wenn wir höhere Werte in unsere Tabelle eintragen? Ich könnte z.B. auch hier, ob bewusst oder unbewusst sei dahingestellt, die Bestellnummer 2000 eintragen. Momentan ist ja noch "IdentityInsert" aktiv, deshalb funktioniert diese Anweisung auch. Ich tippe mir hier die Anweisung noch einmal ein, damit ich nicht immer hinaufscrollen muss, um das Ergebnis anzusehen. Jetzt habe ich hier eine neue Bestellnummer 2000. Wenn ich das mache, wird der Zähler sozusagen hinaufgesetzt. Das heißt, jetzt wird beim nächsten automatischen Vergeben nicht 10012, 10013 usw. vergeben, sondern mit 2001 fortgefahren. Weil sonst hätten wir das Problem, dass hier irgendwann einmal die Nummer hinten in die andere hineinlaufen würde, und das würde zu einem Fehler führen. Das heißt, wenn ich manuell einen Zähler durch Einfügen eines Datensatzes hinaufschraube, dann habe ich quasi alle dazwischen liegenden Nummern übersprungen. Testen wir das aus, indem ich hier noch einmal einen Datensatz einfüge mit automatischer Nummernvergabe. Warum bekomme ich jetzt hier den Fehler? Ich habe vergessen, diese "IdentityInsert"-Option wieder auszuschalten. Das muss ich natürlich machen, bevor ich wieder normal einen Wert eintragen kann. Das mache ich auch; es ist die gleiche Anweisung, die ich hier verwende, nur dass hier am Ende statt "On" eben "Off" zum Einsatz kommt. Ich führe diese Anweisung aus. Jetzt habe ich das Ganze wieder deaktiviert. Nun füge ich hier wieder einen neuen Datensatz mit automatischer Vergabe ein. Betrachten wir das Ergebnis: Wir sehen jetzt hier am Ende, dass als nächstes die Nummer 2001 vergeben worden ist. In diesem Video haben Sie gesehen, wie Sie einen Datensatz beim Microsoft SQL-Server in eine Tabelle einfügen, bei der eine ""Identity", oder man nennt es auch ein "AutoIncrement" definiert ist. Hier wird automatisch eine Nummer vergeben. Sie ignorieren diese Spalte einfach bei der Eingabe. Wenn Sie explizit einmal selber einen Wert eintragen möchten, dann müssen Sie mit der Option "IdentityInsert" dies in Ihrer Session zuvor freischalten. Wenn Sie automatisch beim Einfügen einen Wert abrufen und der Einfügevorgang schlägt fehl, dann wird bei jedem Vorgang eine Nummer verbraucht, und es können dadurch Lücken im Inkrement entstehen.

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!