Ist Access AutoWert (Inkrement) garantiert erhöhen?
Einer bestimmten Tabelle, ich habe mein ID-Feld festgelegt AutoWert (Inkrement). Wenn ich 5 Zeilen dieser Tabelle in schneller Folge, ist jedem garantiert, die eine größere ID als der Letzte? Zum Beispiel funktioniert die automatische Nummerierung immer neu starten 1 wenn einige frühere Werte gelöscht wurden?
InformationsquelleAutor Smashery | 2009-04-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das einzige mal, dass ich jemals Schwierigkeiten hatte, Zugang autonumbers ist, wenn ein Fehler Auftritt, habe ich den Wert eines AutoWert-key-Feld, um eine Zahl niedriger als das aktuelle maximum mit einer Anfügeabfrage. Lücken, die entstanden waren in der Nummerierung von Rekord zu Streichungen. In Access können Sie erzwingen, dass ein Wert in einem AutoWert-Feld, und manchmal (nicht immer, und ich weiß nicht, warum) die automatische Nummerierung wird zurückgesetzt, um die niedrigere Zahl. Schließlich, als Datensätze Hinzugefügt wurden, lief ich in 'duplicate key' Fehler. Andere als diese, ich hatte noch nie Probleme in vielen Jahren.
Gibt es ein paar Antworten auf diese Frage, die darüber reden, einen Inkrement-Wert. Soweit ich weiß, eine Access-AutoWert-Feld kann nur auf 'Inkrement' (1) oder 'Random', und es gibt keine Möglichkeit der Einstellung eines numerischen Inkrement von 1. Falls ich mich irren, bitte mich aufklären.
Ich stehe korrigiert. Der code, der onedaywhen vorausgesetzt, funktioniert nicht in Access, sondern ich habe nach einigen versuchen, die "CREATE TABLE testit (id AUTOINCREMENT(0,5), teststr CHAR)" funktioniert. Die Dinge, die Sie lernen!
InformationsquelleAutor dsteele
Leider, auch Microsoft-Anwendungen sind nicht unfehlbar. Aber das ist so, wie es arbeiten soll, und ich habe es nicht gesehen scheitern; auch gehört es nicht kurz intential oder der zufälligen subversion.
Einfach nicht erwarten, dass es eine Zeile für jeden integer-Wert, obwohl. Zusätzlich zu den gelöschten Zeilen, es wird mit zahlen für append-Operationen ausgeführt werden können.
InformationsquelleAutor dkretz
Die Aussage "Wenn einige Datensätze gelöscht UND die Datenbank komprimiert die nächste Identität zurücksetzen, um die niedrigste verwendete Nummer + 1" ist falsch. Dies geschah in Jet 3.5 verwendet, die in Access 97 aber nicht mit Jet 4.0 verwendet in Access 2000.
warum dann befürworten Sie incremening über zufällige?
Ich bevorzuge Inkrementieren, weil 1423 ist viel einfacher zu merken als -874036470, wenn bei arbeiten an einem system und einem Blick auf die Tabellen.
Random Autonumbers sind auch langsamer in der batch-inserts.
David ist richtig, dass Sie Begehen einen klassischen Fehler: Sinnstiftung zu Werten und soll nicht ausgesetzt werden, um Benutzer-und ja, das beinhaltet power-Anwender und-Entwickler 😉 Sie sollten in der Tat "nie um das, was die AutoWert-Werten sind".
InformationsquelleAutor Tony Toews
David W. Fenton schrieb: "Der Jet-AutoWert-Feld ist nicht ein identity-Feld. Es ist nur eine long-integer-Feld mit einem speziellen default-Wert. Dieser Wert kann sich erhöhen oder ZUFÄLLIG, aber da es nur ein Standardwert, Sie können den anfügen beliebiger long-integer-Wert, der auf dem Feld so lange wie es nicht gegen den index."
Dies ist ein wenig verwirrt. ACE/Jet-SQL-syntax
IDENTITY
Schlagwort (COUNTER
,AUTOINCREMENT
), aber keine AUTOWERT-Schlüsselwort. Eindeutig ein ACE/JetIDENTITY
ist einIDENTITY
!Aber was ich ansprechen will, hier (zu lang für einen Kommentar), ist, die falschen Angaben über Sie, nur "ein long integer-Feld mit einem speziellen default-Wert".
Betrachten Sie diese ACE/Jet-SQL-DDL - (ANSI-92-Abfragemodus-syntax):
Wenn es ausgeführt wird, schlägt fehl mit der Meldung "der Resultierenden Tabelle darf nicht mehr als ein AutoWert-Feld". So klar es ist etwas anderes, als nur ein "special default-Wert" geht.
Den
IDENTITY
Schlüsselwort erstellt einen AutoWert (in Ermangelung eines besseren Begriffs) mit einem sich erhöhenden Algorithmus Werte generieren.IDENTITY
kann nicht verwendet werden, um einen AutoWert mit einem random-Algorithmus oder ein GUID (Replikations-ID) der Geschmack von AutoWert. Für diese anderen Fälle, die Sie tatsächlich benötigen, um ein "special default-Wert" z.B.Wenn Sie eine Technologie nutzen, wie ADOX, zu prüfen, diese Tabelle Eigenschaften (information schema) werden Sie feststellen, dass nur die Spalte erstellt, mit der IDENTITÄT Schlüsselwort hat die Autoincrement-Eigenschaft auf true festgelegt, und diese Spalte ist COLUMN_HASDEFAULT ist falsch und COLUMN_DEFAULT null ist. Also, wenn Sie eine IDENTITY-Spalte hat eine "special default-Wert" der Motor dann nicht sagen.
Im Gegensatz zu
IDENTITY
, mit diesen anderen Aromen von AutoWert-es gibt keine explizit pro-Tabelle Einschränkung z.B. dieser gut funktioniert:Etwas, was ich nicht weiß ist, ob es eine "spezielle default-Wert" entspricht
GenUniqueID()
undGenGUID()
zum erstellen einer auto-increment-Spalte mitDEFAULT
und ohne Verwendung derIDENTITY
Schlüsselwort (oder deren Synonyme). Wenn jemand weiß, der eine oder andere Weg, lassen Sie es mich bitte wissen.BTW der oben genannten Fehlermeldung schlägt vor, ich war falsch über 'AutoWert' wird eine Access-Begriff. Scheint bei den ACE/Jet-engine-Ebene 'AutoWert' ist eine non-keyword synonym für
IDENTITY
(d.h. auto-Inkrement-Geschmack AutoWert), aber nicht ein synonym für andere Aromen von AutoWert.Wenn Sie ADOX verwenden, um zu Lesen die Struktur eines Jets in der Lage, Sie sind immer wieder ADOX syntax, nicht systemeigenen Jet-syntax. Jet Autonumbers Verhalten sich in vielerlei Hinsicht wie standard-IDENTITY-Felder, die auf anderen Datenbanken. Aber das bedeutet nicht, dass Sie umgesetzt werden, den gleichen Weg oder Verhalten sich auf die gleiche Weise-es bedeutet nur, dass für einige Anwendungen ist es ein kompatiblen Art und Weise, Sie zu behandeln.
In Zusammenfassung, wenn Sie mit nicht-nativen Schnittstellen, Blick auf eine Jet-Datenbank, sind Sie nicht gehen, um einheitlichen Terminologie zurück, und Sie erhalten möglicherweise eine unvollkommene Darstellung des Jet ist die Implementierung von bestimmten Objekten. Wenn Sie wissen wollen, wie Jet es tut, dann verwenden systemeigenen Jet-Schnittstellen, D. H., Jet-Dialekt von ANSI-89 DDL-und DAO. Nichts anderes wird kommen, um Sie durch eine übersetzung Schicht, die speziell entwickelt wurde, um alle Datenbank-engines gleich Aussehen, soweit das möglich ist.
Sie scheint Scharnier auf den ANSI-89-Abfrage-Modus syntax als Eine Wahre ACE/Jet-syntax und der ANSI-92-Abfragemodus syntax nicht ACE/Jet-syntax überhaupt. Was wäre es dann? Es ist nicht der SQL Server-syntax. Es funktioniert nicht auf jedem anderen Motor als die Jet/ACE.
Interessant. Ich kann nicht damit es funktioniert z.B.
CREATE TABLE TestAuto (ID COUNTER UNIQUEIDENTIFIER NOT NULL, data_col INTEGER NOT NULL);
führt OK, aber ich am Ende mit einem increment-Spalte (einIDENTITY
Spalte, wenn man will); in anderen Worten, dieUNIQUEIDENTIFIER
Schlüsselwort wird ignoriert. Können Sie post code, der auto-generiert zufällige/guid-Werte ohne VerwendungDEFAULT
? Es wäre gut zu sehen.InformationsquelleAutor onedaywhen
Habe einen Tisch, der früher in einer replizierten Datenbank. Einige der autonumbers negativ sind, und einige sind sehr groß. Das ist normal für eine replizierte Tabelle, so können Sie sicher sein, dass ein AutoWert größer sein wird als die Vorherige Zahl sein, es könnte negativ sein.
Das heißt, der nächste Wert wird größer sein, wenn Ihre automatische Nummerierung ist die Verwendung der SCHRITTWEITE für den nächsten Wert, und Sie haben nicht erreicht die maximale positive Wert.
InformationsquelleAutor Fionnuala
Jet-AutoWert-Feld ist nicht ein identity-Feld. Es ist nur eine long-integer-Feld mit einem speziellen default-Wert. Dieser Wert kann sich erhöhen oder ZUFÄLLIG, aber da es nur ein Standardwert, Sie können den anfügen beliebiger long-integer-Wert, der auf dem Feld so lange wie es nicht gegen den index.
Einer Inkrementierung der AutoWert wird nie wieder 1, außer wenn Sie gelöscht haben, alle Aufzeichnungen und verdichtet, oder im Falle eines korrupten Saatgut-Wert. Letzteres passiert Häufig in den frühen Versionen von Jet 4 (vor service pack 6), wobei der seed-Wert bekommen würde, reset, und dies würde dazu führen, dass alle Arten von Problemen, einschließlich der beschädigten PK-Indizes. Zum Glück, dass Sie schließlich behoben haben, und da Jet ist eine Windows-Komponente, die kaum einen computer gibt, ist nichts weniger als Jet 4 service pack 8.
Als onedaywhen gesagt, können Sie negative Werte, falls die Inkrementierung AutoWert übersteigt die maximale positive Wert für "long integer", aber das würde mir zeigen, dass Sie wahrscheinlich haben genug Datensätze in Ihrer Tabelle, müssen Sie eine andere Datenbank-engine, oder du bist falsch Behandlung Ihrer Tabelle als temporäre Tabelle (D. H., das hinzufügen und löschen einer großen Anzahl von Datensätzen).
Als andere haben auch gesagt, Eindeutigkeit ist nicht gesteuert durch die AutoWert-Datentyp, wird aber durch den index. Wenn Sie einen nicht eindeutigen index, könnte man anfügen doppelte Werte. Ich kann mir nicht vorstellen, warum Sie wollen, ein AutoWert-Feld mit den doppelten Werten, aber der Punkt ist, dass Sie es tun können, wenn Sie nicht hinzufügen einen eindeutigen index. Da die meisten AutoWert-Felder verwendet werden, die als Surrogat Primärschlüssel, Sie haben die einmalige PK-index und die Daten-Tabelle geschrieben wird in der PK um (Cluster). In Bezug auf Einzigartigkeit, wenn Sie mit einem AutoWert als Surrogat-PK und Sie haben eine Natürliche Schlüssel in der Tabelle eindeutig sein muss (und kann eindeutig sein, d.h., keine Null-Werte erlaubt), sollten Sie auch einen eindeutigen index auf die Natürliche Schlüsselfeld(s) (ein einzelnes Feld oder ein zusammengesetzter index).
"Der Jet-AutoWert-Feld ist nicht eine Identität Feld" ich dachte, Semantik waren für Sie wichtig?! 'AutoWert' ist eine Access-Begriff. Der ACE/Jet keywords COUNTER, AUTOINCREMENT und IDENTITÄT. So, ein ACE/Jet-IDENTITÄT ist eine Access-AutoWert mit Inkrement-Algorithmus.
"Eine Inkrementierung der AutoWert wird nie wieder 1, außer wenn Sie gelöscht haben, alle Aufzeichnungen und verdichtet, oder im Falle eines korrupten Saatgut-Wert" -- es gibt einen weiteren Fall: es kann explizit zurückgesetzt wird, mithilfe von SQL DDL (oder eine Komponente wie ADOX, die nicht die gleiche) z.B. ALTER TABLE MyTable ALTER ID INTEGER(500, 5) not NULL; (dies ist ein Beispiel dafür, warum alle Benutzer mit admin-rechten kann ein problem sein!!)
Jet-Daten-Tabellen gruppiert sind und auf der PK, also, wenn Sie ein AutoWert-wie man PK wird, wird es in einem Cluster auf diesem Gebiet. Weiß nich was du meinst zu ZUFÄLLIG und Parallelität. Ich würde nur empfehlen, random Autonumbers außerhalb einer Replik wenn änderungen wurden stark konzentriert auf kürzlich hinzugefügte Datensätze, was bedeuten würde, dass ein zufälliger AutoWert-PK breitete sich die neuesten Aufzeichnungen über viele Daten-Seiten, die der Verbesserung der Parallelität. Aber ich habe keine derartige Empfehlung.
Vielleicht verstehe ich nicht die definition von "Identität Feld," aber meinem Verständnis von der SQL-Spezifikationen ist, dass ein identity Feld kann nicht geschrieben werden, entweder mit einem SQL-UPDATE-oder eine INSERT-SQL. Zwar gibt es eine beliebige Anzahl von Implementierungen des sogenannten "identity-Felder" in verschiedenen db-engines, die nicht erfüllen diese Anforderung, ich denke, es ist wichtig, den Unterschied machen mit dem Jet AutoWert.
InformationsquelleAutor David-W-Fenton
Zuerst, Ihre
IDENTITY
(AutoWert in Access) Spalte mussINTEGER
(Long Integer in Access) im Gegensatz zuUNIQUEIDENTIFIER
(Replikations-ID in Access) verwenden, muss der Inkrement-Algorithmus im Gegensatz zu der random-Algorithmus für die Generierung von neuen Werten und unter der Annahme Ihrer Ausgangswerten und den inkrementellen Werten, bzw. sind beide der Standardwert 1, dann, wenn Sie löschen Sie alle Zeilen in der Tabelle und die Datenbank komprimieren dann dieIDENITTY
Spalte sollte zurückgesetzt auf 1. Wenn nicht, dann müssen Sie möglicherweise installieren Sie einen Jet-service pack (http://support.microsoft.com/kb/287756).Beachten Sie, dass, wenn der maximale positive Wert für
INTEGER
(Long Integer in Access) überschritten werden, würde von der nächsten auto-increment Wert, dann wird es 'wrap' in den negativenINTEGER
Bereich und wird weiterhin Durchlaufen Sie die positiven und negativen Bereiche, generieren doppelte Werte, wo nötig (es sei denn, die Spalte ist zusätzlich abgedeckt durch eine unique-Einschränkung). In der Tat, wenn Sie die Inkrement-Wert ist groß genug, können Sie garantieren, dass die Werte pendeln zwischen größer als und kleiner als die vorherigen auto-increment Wert z.B. (ACE/Jet ANSI-92-Abfragemodus-syntax):Automatisch generierten Werte sind 0, 2147483647, -2, 2147483645, -4, 2147483643, -6, 2147483641, etc.
InformationsquelleAutor onedaywhen
Meine Antwort ist 3 strings von VBA-code!
DistinctCount
Berichte der Anzahl eindeutiger Schlüsselwerte im index. Also eine Tabelle mit 2 Zeilen, AutoWert-Primärschlüssel 1 und 3, DistinctCount geben würde, Sie 2. Nicht sagen, was der nächste AutoWert-Wert.Bitte vergessen Sie nicht, dass Sie Ihre Arbeit mit VBA (Objekt-Sprache), jedoch NICHT mit SQL. Also es kann alles zurück, dass das möglich ist. Ich habe Ihre Beispiel. Also ich bin mir 100% sicher. Es liefert den WERT DES LETZTEN Primärschlüssel, AUCH WENN ES GELÖSCHT WURDE. Inkrement für mich ist das hinzufügen von 1, Letzte index.
Ich habe getestet mit eine alte Datei, die mit vielen übergängen. Diesen code mal korrigiert, damit es läuft, gibt mir 4325, die Anzahl der Datensätze, in der Erwägung, dass der nächste AutoWert ist 2135918951. Ich ebenso getestet, auf dem eine kleine neue Datei mit mehreren löscht und einen Schalter zum ein-text-index. Es sagt mir, dass der aktuelle index ist 1, das ist nicht einmal eine Anzahl der Datensätze. Erfrischend, durch einen Schalter mit der Nummer index, es mir sagen, es ist 2, der nächste AutoWert ist 4. Dies ist zu erwarten, dass aus msdn.microsoft.com/en-us/library/ff191836.aspx ich vermute, @hansup weiß, wovon er spricht und ist in mehr Bereichen als VBA.
Distinct count ist ein count der Datensätze, in denen passende Datensätze werden nur einmal gezählt, es ist nichts zu tun mit dem nächsten AutoWert. Spielen, um sich selbst und Sie werden sehen.
InformationsquelleAutor Anton.
Wenn einige Datensätze gelöscht UND die Datenbank komprimiert die nächste Identität zurücksetzen, um die niedrigste verwendete Nummer + 1 - wenn die Tabelle geleert, die nächste Identität wieder auf 1, nachdem die compact.
InformationsquelleAutor DJ.