2009-07-29 18 views
4

Ein Client von mir versehentlich 500 Datensätze aus einer Zugriffstabelle gelöscht, die ein primäres ID-Feld hat, das als "Autonummer" erstellt wurde. Durch das Ausschalten der Autonummer-Spalte (zurück zu einer Ganzzahl), konnte ich die fehlenden 500 Datensätze von einem Backup wiederherstellen, aber jetzt kann die Autonummer natürlich nicht wieder eingeschaltet werden ...MS Access Autonummer Problem

Was sind einige mögliche Lösungen ? Das ID-Feld wird als Verbindung zu anderen Tabellen verwendet, so dass ich nicht einfach alles neu nummerieren kann, ohne auch alle Tabellen neu zu nummerieren, die auf diese Zahl verweisen (ein Schmerz im Nacken, aber möglich).

Gibt es einen "Trick", um die automatische Nummer wieder einzuschalten, wobei die max (id) als Startpunkt verwendet wird, wenn bereits Daten in der Tabelle vorhanden sind?

+0

Ich kann löschen bestätigen, dass Josip Methode funktioniert, aber ich habe zu fragen. Haben sie nicht gerade ein Backup der DB? – JohnFx

Antwort

4

Machen Sie NewTable mit ID-Feld als AutoNumber (alle Felder müssen gleich sein wie in der ursprünglichen Tabelle - außer ID). Kopieren Sie alle Daten von originalTable zu newtable:

INSERT INTO newTable SELECT * FROM originalTable 

Sobald Daten gefüllt ist, löschen originalTable und benennen newtable zu originalTable.

Auf diese Weise werden alle "Löcher" bei der automatischen Nummerierung beibehalten und bei newTable ist die automatische Nummerierung aktiviert.

P.S. Versuchen Sie immer, Ihren IDs Fremdschlüssel hinzuzufügen. In diesem Fall haben Sie zumindest dann, wenn einige Daten gelöscht werden, einen konsistenten Zustand.

+0

Vergessen Sie nicht, die Beziehungen beim Löschen der ursprünglichen Tabelle und nach dem Umbenennen der neuen Tabelle zu entfernen und neu zu erstellen. Ihr letzter Satz macht mir nicht viel Sinn. Es gibt einige Tabellen, die keine Fremdschlüssel haben. Obwohl diese im Allgemeinen als "Master" -Tabellen oder Nachschlagetabellen bezeichnet werden. Zum Beispiel eine Vorgangsart, Land oder Provinz/Staatstabelle. Und ich bin mir nicht ganz sicher, was Sie in diesem Fall mit "konsistentem Zustand" meinen. –

+0

Ich stimme zu, wenn diese DB korrekt eingerichtet wurde, könnte der Fehler nicht gemacht worden sein (zumindest nicht so einfach), leider, wie bei vielen Projekten, werde ich nach dem Schaden gerufen. Access ist eines dieser Tools, die es auch Nicht-Programmierern ermöglichen, eine ziemlich anständige "Lösung" zu bekommen, bis sie auseinander fällt, weil sie nicht richtig eingerichtet wurde. Ich bekomme eine Menge Arbeit, indem ich meine Kunden auf SQL Server-Lösungen upgrade, sobald sie merken, dass "Joe in der Poststelle" doch nicht wirklich programmieren kann:>) –

+0

Sicher, Access wird sehr respektlos, weil Leute seltsame Dinge damit machen ohne zu wissen, was sie tun. Aber hey, es ist besser als Excel oder, noch schlimmer, Word-Tabellen. –

0

Zustimmen, aber möglicherweise möchten Sie eine ORDER BY hinzufügen, um sicherzustellen, dass die AutoNumber in der richtigen Reihenfolge ist. Andernfalls haben Ihre anderen Tabellen die falsche ID-Zuordnung.

INSERT INTO newTable SELECT * FROM originalTable ORDER BY ID 

Sie werden auch die Felder Name müssen explizit statt mit *

+0

Sie benötigen keine expliziten Namen, wenn Sie die zweite Tabelle mit der ersten identisch machen (außer für das ID-Feld). Die Sortierung nach ID führt hier nichts aus, da die Auto-Nummerierung mit der ID aus der SELECT-Anweisung "überschrieben" wird (die ID ist nicht frei wählbar). Da alle IDs aus der Originaltabelle stammen, werden keine neuen IDs eingeführt und es wird keine falsche ID-Zuordnung stattfinden. –

+0

Stimmen Sie mit * überein, hat Ihren Kommentar "außer ID" im ursprünglichen Beitrag nicht angezeigt. Aber Sie werden immer noch die ORDER BY benötigen. Wenn er die gelöschten 500 Datensätze zurücklegt, werden sie als letzte Zeilen in die Tabelle aufgenommen. Seine ursprüngliche Tabelle hat also die korrekten IDs, ist aber nicht in der richtigen Reihenfolge. Zum Beispiel hinzugefügt Original-Tabelle mit gelöschten Zeilen zurück: 1 Katze 2 Hund 5 Pferde 3 Mouse (wieder hinzugefügt) 4 Kaninchen (wieder hinzugefügt) Wenn Sie diese auf die neue Tabelle zu kopieren, ohne dass eine zu tun ORDER BY auf der ID und mit Autowert eingeschaltet, erhalten Sie: 1 Katze 2 Hund 3 Pferde 4 Maus 5 Kaninchen Wrong IDs –

1

Wenn ich an die gegebenen Antworten hinzufügen könnte.

Eine wenig bekannte Tatsache über Access Auto-Nummernfelder ist, dass der Zähler auf ihnen zurückgesetzt wird, wenn Sie die Datenbank komprimieren und reparieren.

Ich bin auch ziemlich sicher, dass wenn Sie eine Einfügung machen wird es die Zahl verwenden wird, die geliefert wird, anstatt die nächste Zahl in der Auto-Nummerierung, solange> (größer als) der interne Zähler von der automatischen gehalten wird Nummernfeld (geht das überhaupt sinnvoll?)

mit anderen Worten: Sie so etwas wie dies in einem brandneuen Zugriffstabelle tun kann, in dem der Zähler soll auf 1 ...

INSERT INTO myTable (myAutoNumber,myOtherField) VALUES (10000,'other data') 

die andere eingestellt wird Die hier erwähnten Lösungen sind besser, weil sie das Ergebnis besser garantieren würden, also erwähne ich es fast aus akademischen Gründen.

Seth

+0

Von Jet 4 auf, können Sie auch die automatische Nummerierung Samen in ADO gesetzt Code. –

+0

In Jet 3.5 (für Access 97) wurde die automatische Nummerierung auf die höchste autonumber-ID im Feld compact zurückgesetzt. In Jet 4.0 (Access 2000 und neuer) geschieht dies jedoch nur dann, wenn keine Datensätze in der Tabelle vorhanden sind und der Seedwert auf 0 zurückgesetzt wird. –

+0

Tatsächlich können Sie einen Datensatz mit einem Wert in das Feld "Automatische Nummerierung" in die "Mitte" einfügen ein Tisch. So lange dieser Autonummer-Wert nicht schon in der Tabelle ist. Ich habe gerade currentdb.Execute ("INSERT INTO Table1 (ID, Textfeld) VALUES (2, 'Record ID 2')") im Direkt-Fenster getestet, wobei ID das Feld für die automatische Nummerierung ist. –

1

Die ideale Lösung, obwohl es jetzt zu spät ist, wouuld've gewesen, die fehlenden 500 Datensätze in einem Arbeitstisch wiederherzustellen. Führen Sie dann eine Append-Abfrage in die Haupttabelle aus. Dies hätte das Feld Autonumber enthalten.

0

Sie ein neues Feld machen und es auto-Nummer machen und dann ID-Feld und benennen neues Feld id