phpbar.de logo

Mailinglisten-Archive

Re: dump-falscheinordnung bei autoincrement
Archiv Mailingliste mysql-de

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: dump-falscheinordnung bei autoincrement



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


Home | Main Index | Thread Index

php::bar PHP Wiki   -   Listenarchive