Primärschlüsselfelder mit Autowert-Funktion bieten eine komfortable Möglichkeit, für neue Datensätze automatisch einen neuen, eindeutigen Primärschlüsselwert zu vergeben. Wenn man zwischendurch keine Datensätze löscht, ist diese Nummerierung sogar lückenlos. Allerdings kann es sein, dass jemand versucht, gelöschte Datensätze mit den fehlenden Primärschlüsselwerten zu ersetzen. Zu welchen Problemen dies führt und wie Sie diese lösen, zeigt der vorliegende Beitrag.
Autowert-Primärschlüsselfelder
Fast alle Tabellen verwenden ein Primärschlüsselfeld, das über die Autowert-Funktion mit einem neuen, noch nicht vergebenen Wert gefüllt wird (s. Bild 1).

Bild 1: Entwurf einer Tabelle mit Autowert-Primärschlüsselfeld
Mit dem Felddatentyp Autowert legt man automatisch die Eigenschaft Neue Werte auf Inkrement fest, was bedeutet, dass als Primärschlüsselwert beim Neuanlegen von Datensätzen standardmäßig der Primärschlüsselwert des zuletzt angelegten Datensatzes herangezogen und um eins erhöht wird.
Damit ist eine kleine Stolperfalle verbunden, denn dies funktioniert nur, wenn Sie den neuen Datensatz über die Tabelle oder ein an die Tabelle gebundenes Formular eingeben oder dies per VBA erledigen, wobei hier der Primärschlüsselwert explizit nicht festgelegt werden darf, sondern vom System erzeugt werden muss.
Dies erreichen Sie beispielsweise durch folgende kleine Prozedur, die Sie in einem Standardmodul anlegen und per F5 ausführen:
Public Sub NeuerArtikelMitAutowert() Dim db As DAO.Database Set db = CurrentDb db.Execute "INSERT INTO tblArtikel(Artikelname) VALUES(''Beispielartikel'')", dbFailOnError End Sub
Der Autowert wird hier automatisch auf den zuletzt vergebenen Wert plus eins festgelegt.
Die folgende Variante (siehe Prozedur NeuerArtikel_MitVorgegebenemPK im Modul mdlBeispiele) verwendet die folgende INSERT INTO-Anweisung:
db.Execute "INSERT INTO tblArtikel(ArtikelID, Artikelname) VALUES(79, ''Beispielartikel'')", dbFailOnError
Diese legt ebenfalls einen neuen Datensatz an, weist dem Primärschlüsselfeld aber den Wert 79 zu. Sofern dieser bereits vergeben ist, löst dies den Fehler 3022 aus.
Wenn Sie einen Datensatz per DAO anlegen, sieht dies so aus:
Public Sub NeuerArtikel_DAO_MitAutowert() Dim db As DAO.Database Dim rst As DAO.Recordset Set db = CurrentDb Set rst = db.OpenRecordset("tblArtikel", dbOpenDynaset) rst.AddNew rst!Artikelname = "Beispielartikel" Debug.Print rst!ArtikelID rst.Update End Sub
Auch hier wird der Wert des Feldes ArtikelID nicht explizit zugewiesen, sondern in Abhängigkeit vom Autowert des zuletzt angelegten Datensatzes vergeben. Diesen gibt die Prozedur vor dem Speichern des Datensatzes im Direktfenster aus.
Nur für Abonnenten
Ab hier wird’s wirklich spannend – der Rest ist exklusiv für Abonnenten.
Mit dem Abo von Access im Unternehmen bekommst du den kompletten Artikel – inklusive vollständigem Code, Beispieldatenbank und Schritt-für-Schritt-Erklärung.
So sparst du dir stundenlanges Herumprobieren, vermeidest teure Fehler in deiner Access-Anwendung und kannst Lösungen direkt in deinem Unternehmen einsetzen, statt nur darüber zu lesen.
Teste Access im Unternehmen jetzt 4 Wochen lang kostenlos: Voller Zugriff auf alle Artikel, Downloads und Beispieldatenbanken. Kein Risiko – wenn es für dich nicht passt, kündigst du einfach innerhalb der ersten vier Wochen.
Bereits Abonnent? Hier einloggen
Kostenlos & unverbindlich
Oder hast Du eine konkrete Frage zu Deiner eigenen Access-Anwendung?
Vielleicht stellt Deine Anwendung Dich vor eine Herausforderung, zu der Du bisher keine Lösung findest. Schlechte Performance, kein ausreichender Zugriffsschutz, Du bist unsicher über Dein Datenmodell oder Dein Code liefert unerklärliche Fehler?
In unserem kostenlosen Access-Audit schaut sich André Minhorst persönlich gemeinsam mit Dir Deine Lösung per Zoom an – und zeigt Dir, wo Datenmodell, VBA-Code, Ergonomie und Sicherheit Optimierungspotenzial bieten.
Jetzt kostenloses Access-Audit anfordern →