2016-06-01 6 views
1

I Tabelle wie diese haben, weil einige Elemente entfernt wurden:Zurücksetzen IDs logischen Reihenfolge in SQL

+----+--------+--------+--------+------+-----+ 
| id | nav_id | active | name | link | ... | 
+----+--------+--------+--------+------+-----+ 
| 1 | 1 | 1 | Item 1 | .......... | 
| 6 | 2 | 1 | Item 2 | .......... | 
| 15 | 1 | 1 | Item 3 | .......... | 
| 16 | 3 | 1 | Item 4 | .......... | 
| 75 | 1 | 1 | Item 5 | .......... | 
+----+--------+--------+--------+------+-----+ 

Wie Sie sehen können, gibt es IDs, um 1, 6, 15, 16, 75 die schön sortiert werden können. Aber was, wenn ich sie als 1, 2, 3, 4, 5 möchte? Wie kann ich ihre IDs zurücksetzen, so dass es besser ist zu lesen? Nur neugierig, nicht notwendig.

+0

Ich nehme an, Sie sprechen über das Neuzuweisen von Primärschlüsseln? – Takarii

+1

Aus welchem ​​Grund möchten Sie sie als '1, 2, 3, 4'? Wenn die Antwort lautet "weil es schöner ist", dann können Sie 100% sicher sein, dass Sie nichts Nützliches tun (es gibt einen Grund für diese Lücken). – Mjh

+0

Ich denke, Sie könnten alle Elemente in eine neue Tabelle kopieren. Aber welchen möglichen Grund könnte es für so etwas geben? Warum ändern, wie etwas identifiziert wird? Dies scheint, als würde es weit mehr Probleme verursachen, als es löst. – David

Antwort

2

Sie können die folgende Abfrage verwenden:

UPDATE mytable AS t1 
JOIN (
    SELECT id, @rn := @rn + 1 AS rn 
    FROM mytable 
    CROSS JOIN (SELECT @rn := 0) AS v 
    ORDER BY id 
) AS t2 ON t1.id = t2.id 
SET t1.id = t2.rn; 

Aber, ich gegen Durchführung einer solchen UPDATE raten würde. PK-Werte sollten unveränderlich sein, da ihr einziger Zweck darin besteht, einen Tabelleneintrag eindeutig zu identifizieren. Wenn Sie die Darstellung Ihrer Tabelle auf der Präsentationsebene ändern möchten, können Sie dies einfach mit einer SELECT-Anweisung tun.

+0

Ich bekomme '# 1062 - Dupliziere den Eintrag '33' für den Schlüssel 'PRIMARY''. Funktioniert hervorragend für die ersten 11 Aufnahmen, dann hörte es auf. Jetzt sieht mein Tisch so aus: http://image.printscr.com/image/305afc7a2e9049d48630fb4cf5d1e90a.png - '55, 51' - wth? – debute

+0

@debute Ich kann das Problem nicht reproduzieren. Können Sie einige Beispieldaten einrichten und sqlfiddle? –

+0

Ich änderte die ID von "55 und 51" und es funktionierte dann. Vielleicht war das Problem, dass diese IDs vor niedrigeren IDs waren. – debute