2009-12-05 9 views
5

ich eine Tabelle wie die folgende haben,MYSQL: wie man „neu ordnen“, um eine Tabelle

| id | name | color | 
------+--------+--------- 
| 1 | pear | green | 
| 2 | apple | red | 
| 3 | banana | yellow | 
| 4 | grape | purple | 

Ich möchte alphabetisch ordnen den „Namen“ Spalte und setzen Sie die ID (Autoincrement) mit dieser neuen mit der folgenden Reihenfolge

| id | name | color | 
------+--------+--------- 
| 1 | apple | red | 
| 2 | banana | yellow | 
| 3 | grape | purple | 
| 4 | pear | green | 

FRAGE am Ende: wie kann ich das mit MYSQL?

+3

Warum soll die ID-Reihenfolge mit der Namensreihenfolge übereinstimmen? –

Antwort

9

Kann ich fragen, warum Sie das tun möchten?

Wenn jemand einen der Namenswerte ändert oder neue Zeilen einfügt, wird Ihr Bestellschema durcheinander gebracht. Der Versuch, eine Bedeutung in der Reihenfolge der PK zu speichern, die bereits an anderer Stelle in der Tabelle verfügbar ist (die Namensspalte), erscheint redundant und folglich eine schlechte Idee.

Eine viel bessere Lösung ist, sich nicht um den Wert der ID-Spalte kümmern und nur nach der Spalte Name sortieren, wenn Sie die Daten in Ihrer App verwenden.

PS: Entschuldigung für die Antwort vom Antworttyp. Normalerweise würde ich annehmen, dass Sie einen guten Grund haben und nur eine Antwort geben, die direkt darauf anspricht, was Sie zu tun versuchen, aber ich habe von Ihren anderen Fragen bemerkt, dass Sie sich noch in den frühen Lernphasen des Datenbankdesigns befinden, also wollte ich helfen weisen Sie in die richtige Richtung, anstatt Ihnen dabei zu helfen, einen unklugen Ansatz zu verfolgen.

+1

Das ist ein guter Punkt. Wenn Sie eine eindeutige Zahl benötigen, die dem sortierten Wert jeder Zeichenfolge entspricht, können Sie eine zusätzliche Spalte hinzufügen und bei Bedarf aktualisieren. Wenn Sie die ID neu anordnen, führt dies zu Problemen, wenn die ID als Fremdschlüssel in einer anderen Tabelle verwendet wird. –

+0

Das einzige Mal, dass ich vorschlagen würde, eine zusätzliche Spalte zum Sortieren hinzuzufügen, wäre, wenn die Sortierung nicht durch andere Spalten in der Tabelle bestimmt werden kann. Zum Beispiel, wenn die Anwendung den Benutzern erlaubt, die Elemente beliebig zu sortieren. – JohnFx

+1

Die Datensätze bilden eine Menge. Die Sets sollen nicht in einer bestimmten Reihenfolge angeordnet sein. Daran erinnern, dass eine relationale Datenbank-Theorie auf reinen mathematischen Begriffen basiert. Wenn Sie eine bestimmte Reihenfolge in Ihrer Anwendung wünschen, fügen Sie eine Orderby-Klausel hinzu, andernfalls wird der Ausführungsplan entscheiden, wie die Daten und damit die Bestellung abgerufen werden sollen. Diese Pläne können sich im Laufe der Zeit ändern. Beachten Sie außerdem, dass Ersatzschlüssel für den Endbenutzer bedeutungslos sind. – lmsasu

2

Warum nicht "ORDER BY name ASC" am Ende Ihrer Abfrage hinzufügen? Meine Vermutung wäre, dass Sie die ID aus irgendeinem Grund benötigen.

7

Sie können SELECT INTO eine neue Tabelle aus der alten Tabelle, bestellen Sie Ihre Auswahl in wie gewünscht. Haben Sie eine Auto-Inkrement-ID in der neuen Tabelle. Löschen Sie bei Bedarf die alte Tabelle und benennen Sie die neue Tabelle um.

-1
SELECT 
     RANK() Over (ORDER BY Name) As NewID 
    , Name 
    , Color 

FROM Fruits 

könnte eine temporäre Tabelle speichern dann gestutzt dann gestutzt die Frucht Tisch und Einsatz, aber es ist wahrscheinlich eine beschissene Lösung.

+0

MySQL unterstützt keine Fensterfunktionen. –

13

Der sauberste Weg zum Zurücksetzen des automatischen Inkrements ist das Erstellen einer anderen Tabelle.

MySQL bietet Befehle wie CREATE TABLE LIKE und RENAME TABLE, die nützlich sind.

CREATE TABLE table2 LIKE table1; 

INSERT INTO table2 
    SELECT * FROM table1 ORDER BY name; 

DROP TABLE table1; 

RENAME TABLE table2 TO table1; 
+0

Das ist falsch. Sie können nicht alle auswählen (SELECT * FROM table1), denn wenn Sie dies tun, kopieren Sie auch den PK mit derselben Zuordnung, die er mit den Zeileninformationen hat. Das wird Sie mit der gleichen genauen Tabelle verlassen, die denselben Namen und dieselbe Farbe hat, die mit der gleichen ID verbunden sind, aber mit einer anderen Reihenfolge. – MJoraid

+0

eine Korrektur, müssen Sie PK aus Tabelle 2 löschen, bevor Sie aus Tabelle1 einfügen; Wählen Sie dann nicht *, und wählen Sie alle Spalten mit Ausnahme der ID aus. und es wird wie Charme funktionieren – Zalaboza

Verwandte Themen