2010-12-15 6 views
0

i mit primären id eine Tabelle
1 Simer
2 pawan
3 tief
4 Schafe
5 Mann
i umkehren will diesen Auftrag
5 Simer
4 pawan
3 tief
2 Schafe
1 Mann
Umkehr-IDs in SQL-Tabelle

Wie kann ich dies mit Programmierung oder SQL tun? i von SQL, um nicht

verwenden möchten
+3

Warum? Warum? Warum möchten Sie die Reihenfolge des Primärschlüssels ändern? – Mchl

+0

Gute Frage .. –

+2

Warum möchten Sie nicht die Operation ORDER BY verwenden? – Beaker

Antwort

2

Entweder:

1) alle Zeilen, die von id bestellt Wählen Sie in absteigender Reihenfolge und sie dann in eine neue Tabelle in aufsteigender Reihenfolge einfügen, und das AUTO_INCREMENT Tisch zuweist die Bezeichner in umgekehrter Reihenfolge. Jetzt können Sie diese Zeilen mit ihren neuen Kennungen in die ursprüngliche Tabelle zurückkopieren.

2) Wählen Sie alle Zeilen, die von id bestellt, um in ein Programm in absteigender Reihenfolge, löschen Sie sie, und legen Sie sie mit den neuen IDs:

$sql = "SELECT id, name FROM table ORDER BY id DESC"; 
$result = mysql_query($sql); 
while ($row = mysql_fetch_assoc($result)) { 
    $rows[] = $row; 
} 

//empty the table, to avoid primary key conflicts 
mysql_query("TRUNCATE TABLE table");  

$i = 1; 
foreach ($rows as $row) { 
    mysql_query("INSERT INTO table (id, name) VALUES ($i, '" . mysql_real_escape_string($row['name']) . ")"); 
    $i++; 
} 
+0

Ihre Antwort wird das Problem richtig lösen und nur auf einen anderen Ansatz warten, wenn es einen gibt. –

0

ich möchte nicht verwenden, indem sie in SQL-

Aber das ist genau der Grund, warum SQL die ORDER BY-Klausel bereitstellt.

Möchten Sie einfach die Reihenfolge der aktuellen Daten umkehren oder möchten Sie, dass Ihr System abnehmende Sequenznummern neuen Datensätzen zuweist?

Erstere so eine Voraussetzung für letzteres wäre ....

UPDATE yourtable SET id=(4294967295-id); 

anzumerken, dass, während Sie den Betrag steuern kann, die für jedes neue Autoinkrement Wert von der vorherigen unterscheidet sich (durch die Angabe auto_increment_increment), würde man das Problem einfach nicht lösen, da der Basiswert, auf den dieses Delta angewendet wird, SELECT MAX (id) FROM yurtable ist - selbst wenn mysql es erlaubte, ein auto_increment_increment von -1 anzugeben, würden Sie landen Bei doppelten Zeilen müssen Sie daher alle Verweise auf auto_increment-Typen in Ihrem Schema mit geraden Ganzzahlen replizieren und stattdessen einen Sequenzgenerator verwenden. Dann müssten Sie Ihren gesamten Code neu schreiben, um den Sequenzgenerator anstelle von INSERT_ID()/mysql_insert_id() zu verwenden.

Wäre es nicht einfacher, ORDER BY einfach zu verwenden?

+0

Entschuldigung, aber ich habe Ihre Antwort nicht verstanden :) –

+0

aber danke für die Antwort –