{"id":55000585,"date":"2022-06-01T00:00:00","date_gmt":"2022-06-01T00:00:00","guid":{"rendered":"http:\/\/access-basics.de\/585"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Tabellen_basics_Primaerschluesselfelder_mit_Autowert","status":"publish","type":"post","link":"https:\/\/access-basics.de\/index.php\/Tabellen_basics_Primaerschluesselfelder_mit_Autowert.html","title":{"rendered":"Tabellen [basics]: Prim&auml;rschl&uuml;sselfelder mit Autowert"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg07.met.vgwort.de\/na\/8c2c35b63f83435fa8ec650a9fb4a439\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p class='introduction'>Prim&auml;rschl&uuml;sselfelder Was soll das denn sein Und gibt es dann auch Sekund&auml;rschl&uuml;sselfelder Die Antworten auf diese Fragen sind existenziell f&uuml;r den Datenbankentwickler, denn sinnvoll gew&auml;hlte und definierte Prim&auml;rschl&uuml;sselfelder sind die Grundlage f&uuml;r die Arbeit mit den Daten in einer Tabelle. Und es geht noch dar&uuml;ber hinaus: Auch f&uuml;r das Herstellen von Verkn&uuml;pfungen zwischen den Datens&auml;tzen zweier Tabellen sind die Prim&auml;rschl&uuml;ssel unerl&auml;sslich. Warum das der Fall ist, wie Du ein Prim&auml;rschl&uuml;sselfeld definierst und was dabei zu beachten ist, erl&auml;utern wir hier.<\/p>\n<h2>Eindeutige Identifizierung<\/h2>\n<p>Was im echten Leben gilt, hat auch in der Datenbankwelt G&uuml;ltigkeit: Viele Dinge m&uuml;ssen eindeutig identifizierbar sein. Und auch wenn beispielsweise Menschen ziemlich einzigartig sind, besteht der Gesetzgeber in den meisten L&auml;ndern auf einer eindeutigen Identifizierungsm&ouml;glichkeit. In Deutschland gibt es dazu beispielsweise Sozialversicherungsnummern oder Personalausweisnummern.<\/p>\n<p>Der Hintergrund: Wenn ein Mensch eine eindeutige Nummer hat, dann kann man auch die Daten, die zu diesem Menschen an verschiedenen Stellen gespeichert sind, eindeutig zuordnen. Zum Beispiel liegen hinter der Sozialversicherungsnummer die Daten f&uuml;r die Rente.<\/p>\n<p>So &auml;hnlich l&auml;uft es auch in der Tabelle einer Datenbank ab. Auch wenn die Daten von Kunden je nach der Menge der erhobenen Eigenschaften m&ouml;glicherweise eindeutig sind, wenn man sie als Gesamtheit betrachtet (also beispielsweise als Vorname plus Nachname plus Adresse plus Geburtsdatum und so weiter), ist dieses zusammengefasste eindeutige Merkmal doch hier und da etwas unhandlich.<\/p>\n<p>Zum Beispiel dann, wenn es darum geht, einen bestimmten Kunden schnell zu identifizieren &#8211; etwa zum Zwecke des Aufrufs in der Kundendatenbank, wenn der Kunde sich telefonisch meldet und eine Frage zu einer Bestellung hat. Deshalb fragen Telekom und Co. vor dem eigentlichen Kontakt mit einem menschlichen Mitarbeiter auch immer schon automatisch die Kundennummer ab &#8211; so hat der Mitarbeiter im Optimalfall schon die Maske mit den jeweiligen Kundendaten ge&ouml;ffnet, wenn das eigentliche Gespr&auml;ch beginnt. Okay, in der Realit&auml;t fragt der Kundenberater diese Daten trotzdem immer nochmal ab, aber das ist ein anderes Thema &#8230;<\/p>\n<p>Eine eindeutige Identifizierung wie etwa eine Kundennummer ist auf jeden Fall hilfreich, schnell den richtigen Kunden zu finden.<\/p>\n<h2>Eindeutige Zuordnung<\/h2>\n<p>Ein weiterer Aspekt, f&uuml;r den eine eindeutige Identifizierung notwendig und sinnvoll ist, tritt dann eher in der Datenbankwelt auf: Hier treffen wir auf sogenannte Beziehungen zwischen den Datens&auml;tzen zweier Tabellen. Stellen wir uns also vor, dass wir nicht mehr mit dem Kundenberater der Telekom telefonieren und wechseln in die Welt der Projekte. Hier ruft der Kunde beim Projektmanager an und m&ouml;chte mit diesem ein Projekt besprechen &#8211; beispielsweise zum Starten des Projekts oder auch w&auml;hrend der Durchf&uuml;hrung.<\/p>\n<p>Der Projektmanager holt sich dann &uuml;ber die Eingabemaske seiner Projektverwaltung erst einmal den Kundendatensatz hervor (da Projektmanager &uuml;blicherweise keine Kundenanzahl haben wie ein Kommunikationsunternehmen, d&uuml;rfte der Firmen- oder Nachname des Kunden reichen, um diesen zu finden). Die Maske mit dem Kundendatensatz zeigt direkt alle Projekte in der &Uuml;bersicht an, die mit diesem Kunden bisher durchgef&uuml;hrt wurden oder noch laufen.<\/p>\n<p>Und genau dort wird ein eindeutiges Feld zur Identifikation interessant: Wenn wir schon die Kundendaten und die Projektdaten jeweils in eigene Tabellen geschrieben haben, dann wollen wir auch die Zuordnung von Projekten zu Kunden auf m&ouml;glichst effiziente Weise realisieren. Und der effizienteste Weg ist, der Kundentabelle ein Feld mit einem eindeutigen Identifizierer hinzuzuf&uuml;gen, das wir in der Projekttabelle in einem weiteren Feld eintragen, mit dem wir den Kunden f&uuml;r dieses Projekt festlegen.<\/p>\n<h2>Prim&auml;r- und Sekund&auml;rschl&uuml;ssel<\/h2>\n<p>Dieses Feld in der Kundentabelle nennen wir schlie&szlig;lich Prim&auml;rschl&uuml;sselfeld. Prim&auml;r deshalb, weil es noch andere Schl&uuml;sselfelder gibt &#8211; und zwar Sekund&auml;rschl&uuml;sselfelder. Dies sind schlicht Schl&uuml;sselfelder, die zum schnelleren Durchsuchen der Datens&auml;tze einer Tabelle nach anderen Feldern als dem Prim&auml;rschl&uuml;sselfeld gedacht sind.<\/p>\n<h2>Datentyp eines Prim&auml;rsch&uuml;sselfeldes<\/h2>\n<p>Das Anlegen eines Prim&auml;rschl&uuml;sselfeldes schauen wir uns am Beispiel der Kundentabelle an. &Uuml;blicherweise starten wir das Erstellen einer Tabelle mit dem Hinzuf&uuml;gen des Prim&auml;rschl&uuml;sselfeldes. Aber welchen Datentyp sollte das Prim&auml;rschl&uuml;sselfeld haben<\/p>\n<p>Grunds&auml;tzlich kann man Felder fast aller Datentypen zu Prim&auml;rschl&uuml;sselfeldern machen. Wir k&ouml;nnten beispielsweise ein Textfeld als Prim&auml;rschl&uuml;sselfeld verwenden. Vielleicht denkst Du, dass dies n&ouml;tig ist, weil Du eine neue Kundendatenbank programmierst und in diese Daten einer alten Datenbank importieren musst, die eine aus Buchstaben und Zahlen bestehende Kundennummer enth&auml;lt.<\/p>\n<p>In diesem Fall k&ouml;nntest Du, nachdem Du die ben&ouml;tigten Felder im Tabellenentwurf angelegt hast, einfach das Feld <b>Kundennummer <\/b>als Prim&auml;rschl&uuml;sselfeld festlegen. Dies erfordert nur wenig Aufwand: Du markierst das Feld in der Entwurfsansicht und bet&auml;tigst dann den Befehl <b>Prim&auml;rschl&uuml;ssel <\/b>im Ribbon (siehe Bild 1).<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_585_001.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_585_001.png\" alt=\"Einstellen eines Feldes als Prim&auml;rschl&uuml;sselfeld\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 1: Einstellen eines Feldes als Prim&auml;rschl&uuml;sselfeld<\/p>\n<p>Vielleicht ist der passende Ribbonbefehl gerade nicht sichtbar &#8211; dann kannst Du auch mit der rechten Maustaste in die Zeile mit dem Feld <b>Kundennummer<\/b> klicken und den Befehl <b>Prim&auml;rschl&uuml;ssel <\/b>aus dem Kontextmen&uuml; ausw&auml;hlen (siehe Bild 2).<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_585_002.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_585_002.png\" alt=\"Alternative zum Festlegen des Prim&auml;rschl&uuml;sselfelds\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 2: Alternative zum Festlegen des Prim&auml;rschl&uuml;sselfelds<\/p>\n<p>Woher wissen wir nun, ob ein Feld einen Prim&auml;rschl&uuml;ssel enth&auml;lt Das sehen wir zuerst im Entwurf. Nach dem Hinzuf&uuml;gen des Prim&auml;rschl&uuml;ssels wird zuallererst ein entsprechendes Symbol im linken Bereich der Felddefinition in der Entwurfsansicht angezeigt. Au&szlig;erdem werden die Schaltfl&auml;chen zum Hinzuf&uuml;gen eines Prim&auml;rschl&uuml;ssels im Ribbon und im Kontextmen&uuml; hervorgehoben, sodass leicht zu erkennen ist, dass hier bereits ein Prim&auml;rschl&uuml;ssel definiert wurde (siehe Bild 3).<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_585_008.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_585_008.png\" alt=\"Merkmale f&uuml;r das Vorhandensein des Prim&auml;rschl&uuml;ssels\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 3: Merkmale f&uuml;r das Vorhandensein des Prim&auml;rschl&uuml;ssels<\/p>\n<h2>Prim&auml;rschl&uuml;sselfelder erfordern eindeutige Werte<\/h2>\n<p>Damit ist der Prim&auml;rschl&uuml;ssel allerdings noch nicht wirklich angelegt, sondern Du hast damit lediglich angegeben, dass dieser beim n&auml;chsten Speichern des Entwurfs der Tabelle hinzugef&uuml;gt werden soll. Es steht n&auml;mlich noch eine Pr&uuml;fung aus. Eine der wichtigsten Aufgaben eines Prim&auml;rschl&uuml;sselfeldes ist n&auml;mlich, die Eindeutigkeit der im betroffenen Feld enthaltenen Datens&auml;tze sicherzustellen. Das bedeutet, dass in diesem Feld kein Wert doppelt vorkommen darf. Wenn wir nun einen Prim&auml;rschl&uuml;ssel f&uuml;r dieses Feld definieren und diesen speichern wollen, f&uuml;hrt Access zun&auml;chst eine Pr&uuml;fung durch, ob diese Voraussetzung erf&uuml;llt ist. Was bringt ein Prim&auml;rschl&uuml;sselfeld, wenn von Anfang an die wichtigste Eigenschaft nicht erf&uuml;llt ist<\/p>\n<p>Wenn das Feld <b>Kundennummer <\/b>nun mindestens einen Wert zwei Mal enth&auml;lt, k&ouml;nnen wir den Entwurf mit dem hinzugef&uuml;gten Prim&auml;rschl&uuml;ssel gar nicht erst speichern, sondern erhalten eine Fehlermeldung mit folgendem Text:<\/p>\n<pre>Die von Ihnen gew&uuml;nschten &Auml;nderungen an der Tabelle konnten nicht vorgenommen werden, da der Index, der Prim&auml;rschl&uuml;ssel oder die Beziehung mehr vorkommende Werte enthalten w&uuml;rde. &Auml;ndern Sie die Daten in den Feldern, die gleiche Daten enthalten, entfernen Sie den Index, oder definieren Sie den Index neu, damit doppelte Eintr&auml;ge m&ouml;glich sind, und versuchen Sie es erneut.<\/pre>\n<p>Die Meldung ist etwas irref&uuml;hrend, denn zumindest das &Auml;ndern der Daten ist ohne vorheriges Entfernen des Prim&auml;rschl&uuml;ssels nicht m&ouml;glich &#8211; die Tabelle l&auml;sst sich ja nicht speichern und ohne Speichern k&ouml;nnen wir nicht in die Datenblattansicht wechseln, um die Daten anzupassen. Die Vorgehensweise w&auml;re also in diesem Fall, zuerst den Prim&auml;rschl&uuml;ssel wieder vom Feld <b>Kundennummer <\/b>zu entfernen, die Tabelle zu speichern, in die Datenblattansicht zu wechseln und dann eventuelle Dubletten zu entfernen beziehungsweise umzu&auml;ndern.<\/p>\n<h2>Prim&auml;rschl&uuml;ssel entfernen<\/h2>\n<p>Um einen Prim&auml;rschl&uuml;ssel wieder zu entfernen, gehst Du genauso vor wie beim Anlegen: Du markierst das Feld mit dem zu entfernenden Prim&auml;rsch&uuml;ssel und bet&auml;tigst den Befehl <b>Prim&auml;rschl&uuml;ssel <\/b>entweder &uuml;ber das Ribbon oder das Kontextmen&uuml;.<\/p>\n<h2>Optimaler Datentyp f&uuml;r Prim&auml;rschl&uuml;sselfelder: Zahl<\/h2>\n<p>Computer arbeiten am liebsten und schnellsten mit Zahlen. Wenn schon nicht nur 0 und 1, dann doch wenigstens mit Zahlen, aber nicht mit Buchstaben. Das gilt auch f&uuml;r das Auffinden von Datens&auml;tzen nach  verschiedenen Kriterien. Die Suche nach Werten in Zahlenfeldern ist immer schneller als die nach Texten. Und es gibt mehrere F&auml;lle, wo sich dies speziell auf die eindeutigen Identifizierer von Datens&auml;tzen auswirkt. Einer davon sind Beziehungen, &uuml;ber die wir in verschiedenen anderen Artikeln sprechen &#8211; zum Beispiel in <b>Tabellen [basics]: 1:n-Beziehungen <\/b>(<b>www.access-basics.de\/571<\/b>).<\/p>\n<p>Wenn wir n&auml;mlich eine Beziehung zwischen zwei Tabellen anlegen, dann bedeutet das, dass wir in der einen Tabelle ein Feld definieren, das genau die Prim&auml;rschl&uuml;sselwerte der Datens&auml;tze der anderen Tabelle aufnimmt, um jeweils einen Datensatz der beiden Tabellen zu verkn&uuml;pfen.<\/p>\n<p>Nun sucht man beispielsweise nach den Projekten eines Kunden. Wenn nun die Projektetabelle ein Prim&auml;rschl&uuml;sselfeld aufweist, das komplizierte, aus Buchstaben und Zahlen bestehende Projektnummern enth&auml;lt, dann dauert die Suche nach den Projekten eines Kunden viel l&auml;nger, als wenn die Projekte einen eindeutigen Identifizierer h&auml;tten, der nur aus einer Zahl besteht.<\/p>\n<p>Das Ziel sollte also sein, f&uuml;r eindeutige Identifizierung eines Datensatzes ein Zahlenfeld zu nutzen. Das ist beim Neuanlegen einer Datenbank leicht zu realisieren. Aber was, wenn Du bestehende Daten, beispielsweise aus einer Excel-Tabelle, &uuml;bernehmen musst<\/p>\n<p>Auch das ist kein Problem: Dann ist es immer noch sinnvoller, neben den bestehenden Projektnummern (oder auch Kundennummern) zus&auml;tzlich ein Prim&auml;rschl&uuml;sselfeld auf Basis eines neuen Zahlenfeldes zu erstellen.<\/p>\n<h2>Zus&auml;tzliches Feld als Prim&auml;rschl&uuml;sselfeld<\/h2>\n<p>Angenommen also, wir haben die Daten aus einer Excel-Tabelle in die Tabelle unserer neuen Datenbank &uuml;bernommen und wollen dieser neben der dort gepflegten Kundennummer noch ein Feld hinzuf&uuml;gen, das zur eindeutigen Identifizierung der Datens&auml;tze und au&szlig;erdem als Prim&auml;rschl&uuml;sselfeld zur Verkn&uuml;pfung mit anderen Tabellen dienen soll.<\/p>\n<p>Dann ist der erste Schritt, ein neues Feld vor dem bestehenden Feld <b>Kundennummer <\/b>einzuf&uuml;gen. Das gelingt am schnellsten durch Markieren der Zeile mit dem Feld <b>Kundennummer <\/b>und Auswahl des Kontextmen&uuml;befehls <b>Zeilen einf&uuml;gen <\/b>(siehe Bild 4).<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_585_004.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_585_004.png\" alt=\"Einf&uuml;gen eines neuen Feldes\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 4: Einf&uuml;gen eines neuen Feldes<\/p>\n<p>Das neue Feld nennen wir <b>KundeID<\/b> und stellen den Felddatentyp <b>Zahl <\/b>ein. Schlie&szlig;lich haben wir oben geschrieben, dass Zahlenfelder besser zum schnellen Suchen als Textfelder sind.<\/p>\n<h2>Prim&auml;rschl&uuml;sselfelder d&uuml;rfen nicht leer sein<\/h2>\n<p>Wenn wir nun allerdings versuchen, den Entwurf der bereits mit Daten gef&uuml;llten Tabelle zu speichern, erhalten wir eine Fehlermeldung wie in Bild 5.<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_585_003.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_585_003.png\" alt=\"Hinzuf&uuml;gen eines zus&auml;tzlichen Feldes als Prim&auml;rschl&uuml;sselfeld\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 5: Hinzuf&uuml;gen eines zus&auml;tzlichen Feldes als Prim&auml;rschl&uuml;sselfeld<\/p>\n<p>Damit lernen wir neben der Regel zur Eindeutigkeit der enthaltenen Daten gleich die zweite Regel f&uuml;r Prim&auml;rschl&uuml;sselfelder kennen: Prim&auml;rsch&uuml;sselfelder m&uuml;ssen zwingend einen Wert enthalten.<\/p>\n<p>Wir haben allerdings in diesem Beispiel das Feld <b>KundeID <\/b>zu einer Tabelle hinzugef&uuml;gt, die bereits Datens&auml;tze enth&auml;lt. Dieses Feld wird nat&uuml;rlich nicht automatisch f&uuml;r die Datens&auml;tze der Tabelle mit Werten gef&uuml;llt. Das sehen wir, wenn wir den Prim&auml;rschl&uuml;ssel vorerst wieder entfernen (sonst k&ouml;nnen wir den Entwurf nicht speichern) und zur Datenblattansicht der Tabelle wechseln. Das Feld <b>KundeID <\/b>ist f&uuml;r alle Datens&auml;tze leer (siehe Bild 6). Logisch: Woher soll Access auch wissen, welche Werte dieses Feld f&uuml;r die verschiedenen Datens&auml;tze enthalten soll Aber es gibt auch f&uuml;r diesen Fall eine L&ouml;sung.<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_585_005.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_585_005.png\" alt=\"Das neue, als Prim&auml;rschl&uuml;sselfeld gedachte Feld ist leer\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 6: Das neue, als Prim&auml;rschl&uuml;sselfeld gedachte Feld ist leer<\/p>\n<h2>Prim&auml;rschl&uuml;sselwerte automatisch generieren<\/h2>\n<p>Es gibt verschiedene M&ouml;glichkeiten, dass die Werte eines Feldes automatisch von Access gef&uuml;llt werden. Die eine M&ouml;glichkeit ist die Vergabe eines Standardwertes. Wenn es jedoch darum geht, Zahlenwerte f&uuml;r ein Prim&auml;rschl&uuml;sselfeld zu vergeben, ist die <b>Autowert<\/b>-Funktion die zu bevorzugende Variante.<\/p>\n<h2>Neue Werte mit Autowert<\/h2>\n<p>Die <b>Autowert<\/b>-Funktion ist eigentlich auch eine Funktion, die beim Erstellen eines Datensatzes einen Standardwert vorgibt. Die Funktion lautet: Ermittle den Wert des zuletzt angegebenen Wertes in diesem Feld und z&auml;hle Eins dazu. Der Unterschied zu einem Standardwert ist allerdings, dass wir diese Funktion nicht f&uuml;r die Eigenschaft <b>Standardwert <\/b>des Feldes eintragen, sondern dass es einen eigenen Datentyp gibt f&uuml;r Felder, welche diese Funktion nutzen sollen.<\/p>\n<p>Diesen w&auml;hlst Du einfach &uuml;ber das Auswahlfeld in der Spalte <b>Felddatentyp <\/b>in der Entwurfsansicht der Tabelle aus (siehe Bild 7).<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_585_006.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_585_006.png\" alt=\"Festlegen des Datentyps auf Autowert\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 7: Festlegen des Datentyps auf Autowert<\/p>\n<p>Wenn wir nun wieder den Prim&auml;rschl&uuml;ssel zur Tabelle hinzuf&uuml;gen und den Tabellenentwurf speichern, liefert Access keine Fehlermeldung mehr. Den Grund sehen wir, wenn wir nach dem Speichern zur Datenblattansicht wechseln. Hier sehen wir, dass Access f&uuml;r das Autowertfeld automatisch Werte eingetragen hat (siehe Bild 8). Diese beginnen mit 1 und sind dann durchnummeriert.<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_585_007.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_585_007.png\" alt=\"Das neue Autowert-Feld wurde automatisch mit Daten gef&uuml;llt.\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 8: Das neue Autowert-Feld wurde automatisch mit Daten gef&uuml;llt.<\/p>\n<p>Legen wir einen neuen Datensatz in der Tabelle an, erh&auml;lt dieser im Autowertfeld automatisch den zuletzt vergebenen Wert plus Eins, in diesem Fall <b>4<\/b> (siehe Bild 9).<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_585_009.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_585_009.png\" alt=\"Neue Datens&auml;tze erhalten im Autowertfeld normalerweise die n&auml;chsth&ouml;here Zahl.\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 9: Neue Datens&auml;tze erhalten im Autowertfeld normalerweise die n&auml;chsth&ouml;here Zahl.<\/p>\n<h2>Prim&auml;rschl&uuml;sselfeld plus Autowert in einer neuen Tabelle<\/h2>\n<p>Wenn Du eine neue Tabelle anlegst und dort direkt ein Prim&auml;rschl&uuml;sselfeld mit dem Datentyp <b>Autowert <\/b>hinzuf&uuml;gst, ist der Vorgang noch einfacher. Ist die Tabelle noch leer, m&uuml;ssen beispielsweise keine Pr&uuml;fungen erfolgen, ob das Prim&auml;rschl&uuml;sselfeld bereits f&uuml;r alle Datens&auml;tze gef&uuml;llt ist. Das Feld wird dann f&uuml;r den ersten Datensatz mit dem Wert <b>1 <\/b>gef&uuml;llt und f&uuml;r alle folgenden dann nach der oben erw&auml;hnten Vorgehensweise.<\/p>\n<h2>Autowerte mit L&uuml;cken<\/h2>\n<p>Die <b>Autowert<\/b>-Funktion garantiert &uuml;brigens keine l&uuml;ckenlose Durchnummerierung von Datens&auml;tzen im Prim&auml;rschl&uuml;sselfeld. Wir haben weiter oben geschrieben, dass der Autowert den Wert liefert, welcher der zuletzt vergebenen Zahl plus Eins entspricht.<\/p>\n<p>Das bedeutet:<\/p>\n<ul>\n<li>Wenn der Benutzer einen Datensatz mittendrin l&ouml;scht, wird der gel&ouml;schte Prim&auml;rschl&uuml;sselwert nicht neu vergeben.<\/li>\n<li>Auch wenn der Benutzer den zuletzt angelegten Datensatz l&ouml;scht, wird der gel&ouml;schte Prim&auml;rschl&uuml;sselwert nicht neu vergeben.<\/li>\n<\/ul>\n<p>Access merkt sich also f&uuml;r die jeweiligen Tabellen, welcher Autowert zuletzt vergeben wurde.<\/p>\n<p>Es gibt zwei Ausnahmen, die wir kurz anrei&szlig;en wollen:<\/p>\n<ul>\n<li>Wenn die Datenbank komprimiert und repariert wird, werden auch gel&ouml;schte Datens&auml;tze endg&uuml;ltig aus der Datenbank entfernt. In diesem Zusammenhang wird auch der zuletzt vergebene Autowert f&uuml;r jede Tabelle zur&uuml;ckgesetzt, und zwar auf den h&ouml;chsten aktuell in der Tabelle befindlichen Wert.<\/li>\n<li>Die zweite Ausnahme ist eher unwahrscheinlich und tritt auf, wenn per Code ein Datensatz unter Angabe des zu verwendenden Prim&auml;rschl&uuml;sselwertes hinzugef&uuml;gt wird. Auch dann wird dieser Wert als zuletzt hinzugef&uuml;gter Autowert gespeichert. Wenn es bereits gr&ouml;&szlig;ere Werte im Prim&auml;rschl&uuml;sselfeld gibt, kann es sein, dass diese Zahl in der Folge erneut als Autowert vergeben wird. Normalerweise ist eine solche Vorgehensweise nicht notwendig, aber Du kannst das dadurch entstehende Problem f&uuml;r den Fall der F&auml;lle im Hinterkopf behalten.<\/li>\n<\/ul>\n<h2>M&uuml;ssen Prim&auml;rschl&uuml;sselfelder l&uuml;ckenlos sein<\/h2>\n<p>Ist das eventuelle Entstehen von L&uuml;cken in der Durchnummerierung von Prim&auml;rschl&uuml;sselfeldern durch den Autowert &uuml;berhaupt ein Problem Dazu kann es nur kommen, wenn man den Wunsch hat, dass das Prim&auml;rschl&uuml;sselfeld nicht nur der eindeutigen Identifizierung von Datens&auml;tzen dient, sondern gleichzeitig noch als gesch&auml;ftsrelevante Information verwendet wird, die bestimmten Regeln unterliegt &#8211; wie zum Beispiel, dass die Werte l&uuml;ckenlos durchnummeriert sein m&uuml;ssen.<\/p>\n<p>Gibt es f&uuml;r die Daten der Tabelle Regeln, die beispielsweise das Vorhandensein l&uuml;ckenloser laufender Nummern oder von eindeutigen Kennzeichen beispielsweise mit Buchstabenkombinationen erfordern, dann legst Du daf&uuml;r einfach ein eigenes Feld an. Dieses kann dann neben dem Prim&auml;rschl&uuml;sselfeld gepflegt werden.<\/p>\n<h2>Zusammengesetzte Prim&auml;rschl&uuml;ssel<\/h2>\n<p>Es gibt auch die M&ouml;glichkeit, Prim&auml;rschl&uuml;sselfelder aus zwei oder mehr Feldern zusammenzusetzen. Es gibt Beispiele, wo dies f&uuml;r Verkn&uuml;pfungstabellen zur Herstellung von m:n-Beziehungen so gemacht wird. Mehr zu m:n-Beziehungen erf&auml;hrst Du im Artikel <b>Tabellen [basics]: m:n-Beziehungen <\/b>(<b>www.access-basics.de\/574<\/b>).<\/p>\n<p>Solche Verkn&uuml;pfungstabellen realisieren &uuml;ber zwei Fremdschl&uuml;sselfelder Beziehungen zu zwei anderen Tabellen, um beliebige Kombinationen zwischen den Datens&auml;tzen dieser Tabellen zu realisieren. Gleichzeitig sollen sie sicherstellen, dass jede Kombination nur einmal vorkommt.<\/p>\n<p>Ohne dem oben genannten Artikel zu viel vorwegzunehmen: Es gibt zwei M&ouml;glichkeiten, daf&uuml;r zu sorgen, dass jede Kombination nur einmal vorkommt. Die erste ist, einen zusammengesetzten Prim&auml;rschl&uuml;ssel f&uuml;r diese beiden Felder zu erstellen. Die zweite ist, einen zusammengesetzten, eindeutigen Schl&uuml;ssel f&uuml;r diese beiden Felder festzulegen &#8211; und der Tabelle zus&auml;tzlich einen einfachen Prim&auml;rschl&uuml;ssel hinzuzuf&uuml;gen. Wann man was machen sollte, erf&auml;hrst Du im oben genannten Artikel.<\/p>\n<h2>Zusammengesetzten Prim&auml;rschl&uuml;ssel einrichten<\/h2>\n<p>Hier der Vollst&auml;ndigkeit halber noch kurz die technischen Details zum Definieren eines Prim&auml;rschl&uuml;ssels, der aus mehr als einem Feld besteht.<\/p>\n<p>Angenommen, Du m&ouml;chtest die Daten zweier Tabellen namens <b>tblMitarbeiter <\/b>und <b>tblProjekte <\/b>per Verkn&uuml;pfungstabelle in Beziehung setzen, damit Du &uuml;ber diese Tabelle Projektteams zusammenstellen kannst. Dann erstellst Du eine Tabelle beispielsweise namens <b>tblMitarbeiterProjekte <\/b>(alternativ ginge auch <b>tblProjektteams<\/b>) und f&uuml;gst dieser zwei Zahlenfelder namens <b>MitarbeiterID <\/b>und <b>ProjektID <\/b>hinzu.<\/p>\n<p>Diese kannst Du mit dem Nachschlage-Assistenten erstellen, damit die Kombinationen aus Mitarbeitern und Projekten direkt ausgew&auml;hlt werden k&ouml;nnen. Weitere Informationen hierzu findest Du in den Artikeln <b>Tabellen [basics]: Der Nachschlage-Assistent <\/b>(<b>www.access-basics.de\/572<\/b>) und <b>Tabellen [basics]: m:n-Beziehungen <\/b>(<b>www.access-basics.de\/574<\/b>).<\/p>\n<p>Wenn Du diese beiden Felder erstellt hast, markierst Du einfach beide durch einen Mausklick auf das graue K&auml;stchen im linken Bereich der Felddefinitionen bei gedr&uuml;ckter <b>Umschalt<\/b>&#8211; oder <b>Strg<\/b>-Taste und bet&auml;tigst dann die Schaltfl&auml;che zum Hinzuf&uuml;gen eines Prim&auml;rschl&uuml;ssels (siehe Bild 11).<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_585_012.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_585_012.png\" alt=\"Hinzuf&uuml;gen eines zusammengesetzten Prim&auml;rschl&uuml;ssels\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 10: Hinzuf&uuml;gen eines zusammengesetzten Prim&auml;rschl&uuml;ssels<\/p>\n<p>Anschlie&szlig;end zeigen beide betroffenen Felder das Prim&auml;rschl&uuml;sselsymbol an (siehe Bild 12).<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_585_013.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_585_013.png\" alt=\"Ein aus zwei Feldern bestehender Prim&auml;rschl&uuml;ssel\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 11: Ein aus zwei Feldern bestehender Prim&auml;rschl&uuml;ssel<\/p>\n<h2>Felder anderer Datentypen als Prim&auml;rschl&uuml;sselfeld mit Autowert<\/h2>\n<p>Zur Verwendung eines Zahlenfeldes mit Autowertfunktion als Prim&auml;rschl&uuml;sselfeld gibt es nur eine Alternative &#8211; zumindest, wenn die eingebaute Autowertfunktion genutzt werden soll.<\/p>\n<p>Dabei kommen GUIDs als Werte f&uuml;r das Autowertfeld zum Einsatz. GUIDs sind Zahlen-Buchstaben-Kombinationen, die als weltweit eindeutig angesehen werden, da sie als Kombination der Mac-Adresse der Netzwerkkarte des verwendeten Rechners und eines Zeitstempels berechnet werden.<\/p>\n<p>Um diese GUIDs als Wert f&uuml;r Autowertfelder zu nutzen, stellst Du f&uuml;r ein Feld, das Du bereits mit dem Datentyp <b>Autowert <\/b>versehen hast, die Eigenschaft <b>Feldgr&ouml;&szlig;e <\/b>auf <b>Replikations-ID <\/b>ein (siehe Bild 10).<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_585_010.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_585_010.png\" alt=\"Autowertfeld mit alternativem Datentyp\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 12: Autowertfeld mit alternativem Datentyp<\/p>\n<p>Die Bezeichnung <b>Replikations-ID <\/b>ist ein Relikt vergangener Zeiten, als Access noch die Replikation und Synchronisierung von Datenbanken angeboten hat.<\/p>\n<p>In der Datenblattansicht sehen wir dann, dass f&uuml;r das Feld tats&auml;chlich GUIDs angelegt werden (siehe Bild 13).<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_585_011.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_585_011.png\" alt=\"Autowertfeld mit GUIDs\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 13: Autowertfeld mit GUIDs<\/p>\n<p>Es gibt Anwendungsf&auml;lle, wo dieses Format f&uuml;r das Prim&auml;rschl&uuml;sselfeld sinnvoll ist. Wenn Du zum Beispiel Au&szlig;endienstmitarbeiter tags&uuml;ber zu Kunden schickst, um neue Auftr&auml;ge aufzunehmen und es keine M&ouml;glichkeit f&uuml;r die Mitarbeiter gibt, auf eine zentrale Datenbank zuzugreifen, erleichtern solche Prim&auml;rschl&uuml;sselwerte sp&auml;ter das Zusammenf&uuml;hren der zusammengetragenen Daten.<\/p>\n<p>Wenn es keinen solchen Grund gibt, GUIDs als Prim&auml;rschl&uuml;sselwerte zu nutzen, solltest Du auf jeden Fall mit den &uuml;blicherweise verwendeten Zahlen arbeiten. GUIDs brauchen erstens wesentlich mehr Speicher als Zahlen. Und wenn Du die Tabellen dann noch &uuml;ber diese GUID-Werte verkn&uuml;pfen m&ouml;chtest, leidet auch die Performance von Abfragen.<\/p>\n<p>Und falls Du denkst, Speicherplatz und Performance sind nicht relevant f&uuml;r den Einsatzzweck Deiner Datenbankanwendung, noch eine Warnung hinterher: Es ist schon vorgekommen, dass Microsoft Updates ver&ouml;ffentlicht hat, die nicht alle Konstellationen ber&uuml;cksichtigt haben beziehungsweise nicht f&uuml;r alle Konstellationen getestet wurden.<\/p>\n<p>Da ist es dann passiert, dass Tabellen, die einen String-Prim&auml;rschl&uuml;ssel enthielten, nur noch leere Datens&auml;tze angezeigt haben. Allein aus diesem Grund solltest Du nur dann, wenn es absolut notwendig ist, einen Prim&auml;rschl&uuml;ssel ohne Autowert auf Zahlenbasis verwenden.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Prim&auml;rschl&uuml;sselfelder Was soll das denn sein Und gibt es dann auch Sekund&auml;rschl&uuml;sselfelder Die Antworten auf diese Fragen sind existenziell f&uuml;r den Datenbankentwickler, denn sinnvoll gew&auml;hlte und definierte Prim&auml;rschl&uuml;sselfelder sind die Grundlage f&uuml;r die Arbeit mit den Daten in einer Tabelle. Und es geht noch dar&uuml;ber hinaus: Auch f&uuml;r das Herstellen von Verkn&uuml;pfungen zwischen den Datens&auml;tzen zweier Tabellen sind die Prim&auml;rschl&uuml;ssel unerl&auml;sslich. Warum das der Fall ist, wie Du ein Prim&auml;rschl&uuml;sselfeld definierst und was dabei zu beachten ist, erl&auml;utern wir hier.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[662022,66032022,44000003],"tags":[],"class_list":["post-55000585","post","type-post","status-publish","format-standard","hentry","category-662022","category-66032022","category-Tabellen_entwerfen"],"aioseo_notices":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v15.9.2 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Tabellen [basics]: Prim&auml;rschl&uuml;sselfelder mit Autowert - Access [basics]<\/title>\n<link rel=\"canonical\" href=\"https:\/\/access-basics.de\/index.php\/Tabellen_basics_Primaerschluesselfelder_mit_Autowert.html\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Tabellen [basics]: Prim&auml;rschl&uuml;sselfelder mit Autowert - Access [basics]\" \/>\n<meta property=\"og:description\" content=\"Prim&auml;rschl&uuml;sselfelder Was soll das denn sein Und gibt es dann auch Sekund&auml;rschl&uuml;sselfelder Die Antworten auf diese Fragen sind existenziell f&uuml;r den Datenbankentwickler, denn sinnvoll gew&auml;hlte und definierte Prim&auml;rschl&uuml;sselfelder sind die Grundlage f&uuml;r die Arbeit mit den Daten in einer Tabelle. Und es geht noch dar&uuml;ber hinaus: Auch f&uuml;r das Herstellen von Verkn&uuml;pfungen zwischen den Datens&auml;tzen zweier Tabellen sind die Prim&auml;rschl&uuml;ssel unerl&auml;sslich. Warum das der Fall ist, wie Du ein Prim&auml;rschl&uuml;sselfeld definierst und was dabei zu beachten ist, erl&auml;utern wir hier.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-basics.de\/index.php\/Tabellen_basics_Primaerschluesselfelder_mit_Autowert.html\" \/>\n<meta property=\"og:site_name\" content=\"Access [basics]\" \/>\n<meta property=\"article:published_time\" content=\"2022-06-01T00:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"-0001-11-30T00:00:00+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg07.met.vgwort.de\/na\/8c2c35b63f83435fa8ec650a9fb4a439\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Gesch\u00e4tzte Lesezeit\">\n\t<meta name=\"twitter:data1\" content=\"18\u00a0Minuten\">\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebSite\",\"@id\":\"https:\/\/access-basics.de\/#website\",\"url\":\"https:\/\/access-basics.de\/\",\"name\":\"Access [basics]\",\"description\":\"DAS ACCESS-MAGAZIN F\\u00dcR ALLE, DIE VON 0 AUF 100 WOLLEN\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":\"https:\/\/access-basics.de\/?s={search_term_string}\",\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"de\"},{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/access-basics.de\/index.php\/Tabellen_basics_Primaerschluesselfelder_mit_Autowert.html#primaryimage\",\"inLanguage\":\"de\",\"url\":\"http:\/\/vg07.met.vgwort.de\/na\/8c2c35b63f83435fa8ec650a9fb4a439\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/access-basics.de\/index.php\/Tabellen_basics_Primaerschluesselfelder_mit_Autowert.html#webpage\",\"url\":\"https:\/\/access-basics.de\/index.php\/Tabellen_basics_Primaerschluesselfelder_mit_Autowert.html\",\"name\":\"Tabellen [basics]: Prim&auml;rschl&uuml;sselfelder mit Autowert - Access [basics]\",\"isPartOf\":{\"@id\":\"https:\/\/access-basics.de\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/access-basics.de\/index.php\/Tabellen_basics_Primaerschluesselfelder_mit_Autowert.html#primaryimage\"},\"datePublished\":\"2022-06-01T00:00:00+00:00\",\"dateModified\":\"-0001-11-30T00:00:00+00:00\",\"author\":{\"@id\":\"https:\/\/access-basics.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f\"},\"breadcrumb\":{\"@id\":\"https:\/\/access-basics.de\/index.php\/Tabellen_basics_Primaerschluesselfelder_mit_Autowert.html#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/access-basics.de\/index.php\/Tabellen_basics_Primaerschluesselfelder_mit_Autowert.html\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/access-basics.de\/index.php\/Tabellen_basics_Primaerschluesselfelder_mit_Autowert.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"item\":{\"@type\":\"WebPage\",\"@id\":\"https:\/\/access-basics.de\/\",\"url\":\"https:\/\/access-basics.de\/\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"position\":2,\"item\":{\"@type\":\"WebPage\",\"@id\":\"https:\/\/access-basics.de\/index.php\/Tabellen_basics_Primaerschluesselfelder_mit_Autowert.html\",\"url\":\"https:\/\/access-basics.de\/index.php\/Tabellen_basics_Primaerschluesselfelder_mit_Autowert.html\",\"name\":\"Tabellen [basics]: Prim&auml;rschl&uuml;sselfelder mit Autowert\"}}]},{\"@type\":\"Person\",\"@id\":\"https:\/\/access-basics.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f\",\"name\":\"Andr\\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/access-basics.de\/#personlogo\",\"inLanguage\":\"de\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","_links":{"self":[{"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/posts\/55000585","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/comments?post=55000585"}],"version-history":[{"count":0,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/posts\/55000585\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/media?parent=55000585"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/categories?post=55000585"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/tags?post=55000585"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}