2010-03-16 24 views
5

Ich möchte wissen, ob ich den Autoincrement-Wert in mysql wieder auffüllen kann.wie autoincrement in mysql neu zu befüllen/neu erstellen

Weil, ich habe Datensätze, die wie folgt aussehen:

ID Name 
1 POP 
3 OLO 
12 lku 

Grundsätzlich möchte ich einen Weg, um die ID zu dieser

ID Name 
1 POP 
2 OLO 
3 lku 

Gibt es eine Möglichkeit zu aktualisieren diese in MySQL zu tun?

Danke.

Antwort

3

Es ist nicht die beste Vorgehensweise, Ihre Primärschlüssel zu manipulieren - besser, damit Ihre DB selbst damit umgehen kann. Es kann Probleme geben, wenn zwischen UPDATE und ALTER ein weiterer Datensatz hinzugefügt wird. Aus diesem Grund müssen Sie LOCK die Tabelle, die andere Abfragen und Spitzenlast auf einem ausgelasteten Produktionsserver hängen kann.

LOCK TABLES table WRITE 
UPDATE table SET id=3 WHERE id=12; 
ALTER TABLE table AUTO_INCREMENT=4; 
UNLOCK TABLES 

ODER - für Tausende von Zeilen (ohne foriegn Schlüsselbeziehungen):

CREATE TEMPORARY TABLE nameTemp(name varchar(128) not null) 
INSERT INTO name SELECT name FROM firstTable 
TRUNCATE firstTable 
INSERT INTO firstTable SELECT name FROM nameTemp 

Die letztere Methode wird nur funktionieren, wenn Sie keine Fremdschlüssel haben. Wenn Sie dies tun, benötigen Sie eine Nachschlagetabelle.

CREATE TEMPORARY TABLE lookup(newId INTEGER AUTO_INCREMENT, oldId INTEGER, PRIMARY KEY newId(newId)); 
INSERT INTO lookup (oldId) SELECT id FROM firstTable 
[do temp table queries above] 

Sie haben nun eine lookup Tabelle mit dem alten zu neuen IDs, die Sie die Fremdschlüsselbeziehungen auf Ihren anderen Tabellen aktualisieren können (auf einem Testserver!)

+0

Nein, ich habe Tausende von Datensätzen, für die ich neu bevölkern möchte. Diese Daten sind nur Beispiele. – JPro

+0

Für Tausende von Datensätzen aktualisiert – Andy

0

der Primärschlüssel ändern a sehr schlechte Idee, wie es Ihre referentielle Integrität gefährdet (was ist, wenn eine andere Tabelle die ID ohne einen Fremdschlüssel mit richtigen "on change" verwendet?).

Wenn Sie wirklich, wirklich, es zu tun haben, und kümmern sich nicht über schlechte Nebenwirkungen:

  • Erstellen Sie eine zweite Tabelle mit identischer Struktur
  • INSERT INTO new_table (id, [andere Felder]) SELECT NULL, [andere Felder] FROM old_table;
  • DROP old_table;
  • RENAME new_table old_table;

Warnung:
Dies wird jede andere Tabelle beschädigen, die Fremdschlüssel in dieser Tabelle hat (aber wenn Sie eine solche haben dann würden Sie nicht sowieso tun dies werden).

0

Sie möchten vielleicht so etwas wie versuchen ...

Create Temporary table MyBackup 
( ID as your autoincrement, 
    OldID as Int for backlinking/retention, 
    RestOfFields as their type) 

insert into MyBackup 
( OldID 
    RestOfFields) 
select 
    ID as OldID, 
    RestOfFields 
    from 
    YourOriginalTable 
    order by 
    ID (this is your original ID) 

Dann haben Sie eine neue Tabelle mit einem Autoinkrement mit neuen IDs zugewiesen, noch eine vollständige Kopie ihrer ursprünglichen ID. Anschließend können Sie korrelierte Aktualisierungen für andere Tabellen durchführen und ID = ID mit ID = OldID festlegen. Wenn Sie Ihre Bestellung bei der Bestellung durch die Original-ID beibehalten, wird verhindert, dass die Nummern aus der Reihenfolge ersetzt werden.Ex: Wenn Ihre Tabelle als Old ID = 3, neue ID = 1 Alt ID = 1, neue ID = 3 Alt ID = 12, neue ID = 2

Ihr alten 3s orderd wurde, wird 1en werden, dann die 1 würde der 3s werden, und 12 ist geworden 2 des

Alt ID = 1, neue ID = 1 Alt ID = 3, neue ID = 2 Alt ID = 12, neue ID = 3

Ihre 3s won Überschreibe die höhere Zahl nicht, und die 12er werden nicht mit den 3en in Konflikt geraten, da die Dreien bereits auf Zweien abgesenkt wurden.

Verwandte Themen