Mailinglisten-Archive |
Ulrich Vogel schrieb am Freitag, den 8. Oktober 1999: > ich lasse neue Datensaezte mit autoincrement eintragen. > > Zwischendurch werden einzelne Datensaetze geloescht. > > Nun werden bei mir bei einem dump Datensaetze mit hoeheren ID- > Nummern in die "Luecken" die ein geloeschter Datensatz > hinterlassen hat, eingefuegt. > > z.B. > > 10 > 11 > 15 > 13 > 14 > > ist das normal? Ja, ganz normal. Du bekommst die Datensätze auch in der gleichen Reihenfolge, wenn Du SELECT * FROM yourtable; ausführst, also ohne ORDER BY. Bei relationalen Dtenbanksystemen haben die Datensätze prinzipiell keine festgelegte Reihenfolge, denn es sind einfach nur Elemente einer Menge, die durch ihren Primärschlüssel indentifiziert werden. Will die Ausgabe eines SELECTs irgendwie sortiert haben, dann muß man ORDER BY verwenden. Speziell bei MySQL ist es so, daß die Datensätze einer Tabelle natürlich schon in einer gewissen Reihenfolge in den zugehörigen ISAM-Dateien gespeichert sind - das ist genau die Reihenfolge, die man beim obigen SELECT ohne ORDER BY bekommt. Neue Datensätze werden an die erste freie Stelle gespeichert, was meistens am Ende der ISAM-Datei ist, aber auch mitten drin sein kann, wenn durch das Löschen von Datensätzen Lücken entstanden sind (erst nach einem OPTIMIZE-Befehl verschwinden solche Lösch-Lücken mit). Diese Details der Speicherung und Speicherreihenfolge können sich aber jederzeit ändern (vielleicht funktionieren ja schon die neuen MyISAM-Tabellen anders?), weshalb man sich im Normalfall nie auf eine bestimmte Reihenfolge verlassen sollte, sondern immmer, wenn die Ordnung wichtig ist, diese auch ausdrücklich per ORDER BY sicherstellt. > Wie kann man beim dump die numerisch richtige Reihenfolge der > Datensaezte hinbekommen? So direkt geht es leider nicht, aber mit einem Trick: 'mysqldump' kennt auch die Option '--where', mit der man die Datensatzmenge einschränken kann. Anscheinend hängt 'mysqldump' einfach ein "WHERE ..." an eine intern zusammengestellte SQL-Anfrage an und schickt diese dann an MySQL. Der Trick ist, daß es auch funktioniert, hinter den eigentlichen WHERE-Teil auch noch 'ORDER BY' anzuhängen! Ein Hack ... mysqldump --where '1=1 ORDER BY id' dbname tablename Ciao, Martin -- Martin Ramsch <m.ramsch_(at)_computer.org> <URL: http://home.pages.de/~ramsch/ > PGP KeyID=0xE8EF4F75 FiPr=5244 5EF3 B0B1 3826 E4EC 8058 7B31 3AD7 --- *** Abmelden von dieser Mailingliste funktioniert per E-Mail *** an mysql-de-request_(at)_lists.4t2.com mit Betreff/Subject: unsubscribe
php::bar PHP Wiki - Listenarchive