Anatol: MySQL - Willkürliche Reihenfolge bei insert into

Hallo Forum,

Ich habe ein Problem mit MySQL (in Verbindung mit PHP). Ich möchte die
Angaben, die in ein Formular geschrieben wurden in eine MySQL-Datenbank
übertragen. Das ist soweit auch kein Problem - die Reihenfolge, in der
sie aber in die Datenbank eingetragen werden scheint völlig willkürlich
zu sein. Das ganze läuft bei mir zwar über eine leicht verschachtelte
Funktion ab, aber im Grunde ist es nichts anderes, als würde ich es
vereinfacht so schreiben:

$query = "insert into tabelle values ('Eintrag1')";
$result = mysql_query($query,$link);

$query = "insert into tabelle values ('Eintrag2')";
$result = mysql_query($query,$link);

usw.

Ich kann mir einfach nicht erklären, warum die Reihenfolge in der Datenbank
dann beispielsweise so aussieht:

Eintrag3
Eintrag1
Eintrag2

Leider wirkt sich das dann auch auf die Reihenfolge bei der Ausgabe der
Daten aus.
Kennt irgendjemand dieses Problem? Ich bin dankbar für jeden Tip.

Viele Grüße
Anatol

  1. Hi,

    Ich kann mir einfach nicht erklären, warum die Reihenfolge in der Datenbank
    dann beispielsweise so aussieht:

    die Datenbank ist so optimiert, daß sie möglichst schnell arbeitet - eben so schnell, wie es die Datensicherheit erlaubt. Wenn dann ein Eintrag nicht hinten landet: Nun, überlege mal, warum es "insert _into_" heißt ;-)

    Leider wirkt sich das dann auch auf die Reihenfolge bei der Ausgabe der
    Daten aus.

    Dafür gibt es "order by" im Select-Statement.

    Cheatah

    1. Hallo Cheatah,

      die Datenbank ist so optimiert, daß sie möglichst schnell arbeitet - eben so schnell, wie es die Datensicherheit erlaubt. Wenn dann ein Eintrag nicht hinten landet: Nun, überlege mal, warum es "insert _into_" heißt ;-)

      Naja, ich hatte eben gehofft, dass ich es mir ersparen könnte, in jede Tabelle noch eine "Zählerspalte"
      einzufügen, um die Einträge geordnet auszugeben. ("select * from tabelleX order by counter" oder so...)
      Es geht nämlich nicht um eine alphabetische Ordnung, es sollte eben in der Reihenfolge wieder
      ausgegeben werden, in der ich es eingegeben habe. Naja, dann mach ich mich mal dran, die Tabellen
      neu anzulegen. :-(

      Danke für die Erklärung,
      Anatol

      1. Hi,

        Naja, ich hatte eben gehofft, dass ich es mir ersparen könnte, in jede Tabelle noch eine "Zählerspalte"
        einzufügen, um die Einträge geordnet auszugeben. ("select * from tabelleX order by counter" oder so...)
        Es geht nämlich nicht um eine alphabetische Ordnung, es sollte eben in der Reihenfolge wieder
        ausgegeben werden, in der ich es eingegeben habe.

        Du denkst in Listen - SQL denkt in Mengen. Mengen haben keine "Ordnung".
        Vielleicht ist SQL gar nicht die passende Lösung für Dein Problem?

        Michael

      2. Hallo!

        die Datenbank ist so optimiert, daß sie möglichst schnell arbeitet - eben so schnell, wie es die Datensicherheit erlaubt. Wenn dann ein Eintrag nicht hinten landet: Nun, überlege mal, warum es "insert _into_" heißt ;-)

        Yoh, und ausserdem ist die Rueckgabemenge eines SELECT per definition unsortiert (ausser mit ORDER BY), also auch nicht in der Reihenfolge der Eintragung sortiert. Man stelle sich einfach mal nicht die Tabelle als Tabelle (also jede Menge Datensaetze untereinander geschrieben) vor, sondern als Kreis oder Kugel, in der viele kleine Punkte (die Datensaetze) umherschwirren. Wuerde man bei diesem Bild eine Sortierung erwarten, wenn man nur ein Filterkriterium beim SELECT angibt?

        Naja, ich hatte eben gehofft, dass ich es mir ersparen könnte, in jede Tabelle noch eine "Zählerspalte"
        einzufügen, um die Einträge geordnet auszugeben. ("select * from tabelleX order by counter" oder so...)

        Entweder Du nimmst wirklich einen Counter (die meisten Datenbanken bieten so einen automatischen an), oder Du traegst einfach die aktuelle Uhrzeit (z.B. in Sekunden seit 1970) noch in einer extra Spalte ein. Bei letzterem kannst Du dann auch einfach feststellen, wann ein Datensatz eingetragen wurde - falls das mal irgendwie interessant sein koennte. (Ich verwende sowas ab und zu fuer statistische Auswertungen.) Das bringt aber dann nicht mehr viel, wenn Du mehrere DS pro Sekunde eintraegst. Denn dann werden durch die Sortierung nach diesem Feld zwar noch alle DS derselben Sekunde nebeneinander liegen, jedoch untereinander auch wieder unsortiert sein.

        So long

        1. Hallo,

          ich muß wohl wirklich einen Counter verwenden, denn es werden tatsächlich
          mehrere Datensätze "auf einmal" in dieselbe Tabelle geschrieben, da hilft
          die Uhrzeit auch nicht weiter. Ist mit dem Counter aber kein Problem, ich
          muß eben noch eine Spalte einfügen.

          Vielen Dank für eure Tips!
          Anatol