Probleme mit Primärschlüsseln und Autowert

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).

Entwurf einer Tabelle mit Autowert-Primärschlüsselfeld

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.

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

den kompletten Artikel im PDF-Format mit Beispieldatenbank

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar