Wie mysql Tabelle neu indizieren

7

Ich habe eine Tabelle mit vielen Zeilen, aber sie sind nicht in Ordnung. Ich benutze das Feld "id" als Primärschlüssel. Ich habe auch ein "date" -Feld, das ein Datetime-Feld ist.

Wie könnte ich die Tabelle neu indizieren, so dass die Einträge in chronologischer Reihenfolge gemäß dem Datumsfeld

identifiziert werden     
mrpatg 18.01.2010, 21:51
quelle

6 Antworten

8

Die Art und Weise, wie ich es tun würde, ist eine neue Tabelle mit Auto-Increment-Index zu erstellen und einfach alle Ihre alten Tabellen nach Datum sortiert auszuwählen. Sie können dann Ihre alte Tabelle entfernen.

    
Josh 18.01.2010, 21:56
quelle
9

Warum möchten Sie, dass die ID-Reihenfolge mit den Daten übereinstimmt? Es klingt, als ob du ORDER BY id machen willst und die Reihen in der Reihenfolge des Datums zurückkommen. Wenn Sie Zeilen in Datumsreihenfolge verwenden möchten, verwenden Sie stattdessen ORDER BY date .

Werte in einer Autoinkrement-ID-Spalte sollten als willkürlich behandelt werden. Es ist keine gute Idee, sich darauf zu verlassen, dass sich Ihre IDs in der richtigen Reihenfolge befinden.

    
Wyzard 18.01.2010 22:21
quelle
8

Wie wäre es mit einer einfachen Abfrage mit einer Variablen:

%Vor%

Damit werden Ihre Zeilen wie folgt sortiert: 0,1,2,4,5 ... usw. nach Ihrem Datum.

    
Ryun 06.05.2011 11:25
quelle
6

Das folgende SQL-Snippet sollte tun, was Sie wollen.

%Vor%

Beachten Sie, dass Sie niemals die Reihenfolge einer automatisch inkrementierten Spalte garantieren können, nachdem Sie mit dem Einfügen und Entfernen von Daten begonnen haben. Daher sollten Sie sich nicht auf eine Reihenfolge verlassen, die in Ihren Abfragen ORDER BY angibt. Dies ist eine teure Operation, die Sie durchführen, da Indizes vollständig neu erstellt werden müssen. Daher würde ich nicht empfehlen, dies häufig zu tun.

    
zombat 18.01.2010 22:16
quelle
2

Sie können ALTER TABLE verwenden t ORDER BY col; Die zulässige Syntax von ORDER BY ist wie in SELECT-Anweisungen.

    
sibidiba 19.01.2010 00:06
quelle
0

Ich musste etwas Ähnliches tun. Der beste Weg, dies zu tun, war der folgende ( Sie können es in einer SQL-Abfrage ausführen, wenn Sie wollen, aber bedenken Sie, dass dies eine langsame und sehr ressourcenintensive Operation ist ):

MACHEN SIE SICH SICHER, EINE SICHERUNG IHRER TABELLE, EINSCHLIESSLICH STRUKTUR UND DATEN, ZU MACHEN, BEVOR SIE DIESE FRAGE STARTEN!

%Vor%

Vergessen Sie nicht, "your_table" mit dem Namen Ihrer Tabelle und den ORDER BY-Spalten zu ändern. Hier erkläre ich Ihnen Schritt für Schritt, was Sie tun:

  1. Zuerst fügen Sie eine neue Spalte namens "temp_id" hinzu ( stellen Sie sicher, dass es sich nicht um einen Namen handelt, den Sie bereits verwenden );
  2. Als nächstes fügen Sie eine temporäre Variable hinzu, die gleich 0 ist ( oder was immer Sie wollen, damit Ihre ID von beginnt);
  3. Dann aktualisieren Sie Ihre Tabelle Zeile für Zeile nach der gesetzten ORDER-Logik, setzen einen Wert für Ihre neue Spalte "temp_id" gleich der von Ihnen gesetzten Variable und erhöhen diese Variable dann um 1 ( können Sie tun etwas funky hier, zum Beispiel wenn du möchtest, dass deine IDs immer gerade sind, kannst du @a + 2 setzen;
  4. Im nächsten Schritt löschen Sie Ihre alte Spalten-ID;
  5. Dann ändern Sie den Namen Ihrer temp_id-Spalte zurück in ID und es als positive Ganzzahl mit automatischem Inkrement, das der Primärschlüssel Ihrer Tabelle ist.
  6. Da ID jetzt die neu hinzugefügte Spalte temp_id ist, befindet sie sich am Ende Ihrer Tabellenstruktur. Um es als erste Spalte erneut zu verschieben, führen Sie die letzte Abfrage aus, um sicherzustellen, dass es sich um die erste Spalte handelt.
quelle

Tags und Links