2009-09-30 9 views
10

Ich habe eine MySQL-Tabelle mit einer autoinkrementierten ID-Spalte. Die ID begann von 1 und ist jetzt in den 4000ern.Was passiert, wenn Autoinkrement mit vorhandenen Daten in MySQL kollidiert?

Allerdings muss ich auch einige Legacy-Daten aus einer alten Version der Anwendung in diese Tabelle portieren. Die IDs dieser Daten beginnen bei 5000 und müssen für Überwachungszwecke aufbewahrt werden.

Was passiert, wenn ich einen Eintrag einfüge, nachdem mein Autoinkrement-Zähler bis zu 4999 ist? Ist Autoincrement intelligent genug, um nach der nächsten verfügbaren ID zu suchen, oder wird es abstürzen, weil es versucht, die ID 5000 einzufügen, die bereits existiert?

Während Ratschläge, wie man dieses Problem umgehen kann, sehr hilfreich sind, würde ich auch gerne verstehen, was MySQL in dieser Situation tun würde und ob ich überhaupt eingreifen muss.

Antwort

4

Autoinkrement verwendet die nächste verfügbare ID für InnoDB- und MyISAM-Tabellen.

Ich habe dies für MySQL 4.1.22 unter Windows Vista getestet. Ich habe zwei einfache Tabellen erstellt, eine mit InnoDB und eine mit MyISAM. Jeder hatte einen automatischinkrementierenden Primärschlüssel namens 'id' und eine varchar-Spalte namens 'description'.

lief ich die folgenden Befehle (ohne Fehler):

INSERT INTO MyIsamTest (description)  VALUES ('autoincrement id insert'); 
INSERT INTO MyIsamTest (id, description) VALUES (100, 'manual id insert'); 
INSERT INTO MyIsamTest (description)  VALUES ('autoincrement id insert'); 

SELECT * FROM MyIsamTest; 

ich folgendes Ergebnis bekam, was zeigt, dass die 'id' Spalte richtig autoinkrementierten wurde:

+=====+=========================+ 
| id | description    | 
+=====+=========================+ 
| 1 | autoincrement id insert | 
+-----+-------------------------+ 
| 100 | manual id insert  | 
+-----+-------------------------+ 
| 101 | autoincrement id insert | 
+-----+-------------------------+ 

ich die wiederholte experimentiere mit demselben Ergebnis an meiner InnoDbTest-Tabelle.

+0

Wir haben etwas in einer transaktionalen innoDB -Tabelle, in der es sich automatisch nach oben, aber unter der maximalen ID erhöht. Ich denke, dieser einfache Test ist einfach zu einfach. Ich bin ziemlich sicher, dass mysql vorhandene IDs automatisch überspringt, aber ich bin nicht 100% –

+0

Ja, wir haben auf innoDb Autoinkrement niedriger als max (ID), nicht sicher, was passieren wird –

+0

Das Problem mit Ihrem Test hier ist, dass Sie haben eingefügt mit einer normalen insert-Anweisung. Ich hatte ziemlich viele Probleme, bei denen ich regelmäßig eine Produktionsdatenbank auf einem Entwicklungsserver wiederherstellte, und die automatischen Inkremente des Entwicklungsservers werden nicht aktualisiert und kollidieren daher mit den bereits vorhandenen Produktionsdaten, wenn ich sie erstelle ein neuer Eintrag in dev. –

6

Autoincrement wird die nächste verfügbare ID für beiden InnoDB und MyISAM-Tabellen verwenden, aber Sie können es manuell nächste Position in der folgenden Art und Weise ist ändern:

nach dem Einsatz, können Sie das Auto-Inkrement auf einen Wert über der jetzt einstellen könnten -höchste ID:

ALTER TABLE tbl AUTO_INCREMENT = 9000; 
+0

+1 - es ist sehr wahrscheinlich, dass es mehrere Tabellen seiner Altdaten gibt, und dies ist der beste Weg darum. – nickf

+0

Nicht notwendig, es wird automatisch gemacht. – DisgruntledGoat

0

Wenn Sie nur ohne Abhängigkeiten von dem ids ein Vermächtnis Tabelle haben, dann, was ich tun würde, ist eine temporäre Tabelle erstellen, um all Ihre neue Daten in einfügen (mit IDs 5000+) . Führen Sie dann folgendes aus:

INSERT INTO `myrealtable` (column1, column2, column3) 
SELECT column1, column2, column3 
FROM `temptable`; 

DROP TABLE `temptable`; 

... wo keiner der columnX Spalten die primäre auto_increment ID ist.

0

Ausprobieren einer Testdatenbank und sehen, was passiert, mit lampp/xampp usw.

0

ich MySQL prüft glauben, wenn Sie auf eine automatisch inkrementierte Spalte einfügen und AUTO_INCREMENT aktualisieren, so dass AUTO_INCREMENT> MAX (id), aber ich muss die Dokumente durchsehen. Sie sollten Andrew Duffys Vorschlag trotzdem folgen, um sicher zu sein.

0

Mit MySQL können Sie den internen auto_increment-Wert nicht niedriger als die aktuelle höchste ID festlegen.

Wenn Sie also 1000 Zeilen beginnend bei 5000 hinzufügen, wird das Inkrement auf 6000 gesetzt. Sie können immer noch Zeilen mit IDs hinzufügen, die noch nicht existieren (z. B. 4500), aber es lohnt sich nicht wirklich zu stören. Es gibt viele Zahlen zwischen 6000 und 4 Milliarden.

0

Wenn Sie Daten mit bereits zugewiesenen Primärschlüsseln in MyISAM einfügen, ist der Wert der AUTO_INCREMENT -Spalte für die nächste Einfügung maximal (Spalte) + 1, also wird es funktionieren.

Da Sie jedoch MyISAM nicht verwenden, da dies wichtige Daten sind, verwenden Sie InnoDB, das die oben genannte Anweisung ALTER TABLE benötigt.

Verwandte Themen