Dogfish: MySQL: Datensatz mit ID einfügen, alle IDs drüber hochzählen

Hallo ihr da draußen,

ich habe eine Datenbank, bei der sind die Datensätze mit einem Feld ID nummeriert. Ich rufe das ganze dann immer mit ORDER BY ab. Nun hab ich so ein kleines Script geschrieben, in dem wird per INSERT INTO ein Datensatz angefügt.
Problem: Nun muss ich in einer for-Schleife (ach ja, hab ich ganz vergessen, ich verwende PHP) alle IDs, die größer sind als die ID des neuen Datensatzes um 1 hochzählen.

Gibt es nun eine einfachere Möglichkeit, das heißt, dass ich mit einem MySQL-Aufruf automatisch alle IDs hochzählen lassen kann, oder muss ich es bei der herkömmlichen Methode belassen?

Danke schon mal im Vorraus,

Grüße von hier drinnen, aus Biberach an der Riss,

Dogfish

  1. HI;

    du kannst in mysql das id - feld auf autoincrement
    setzen, so das es automatisch beim eintragen eines neuen datensatzes erhöht wird.

    mfg stefan

    1. Aloha!

      du kannst in mysql das id - feld auf autoincrement
      setzen, so das es automatisch beim eintragen eines neuen datensatzes erhöht wird.

      Das hilft IMO nix. autoincrement sorgt dafür, daß beim Einfügen neuer Daten, bei denen man dieses Feld _nicht_ explizit angibt, dieses automatisch hochgezählt wird.

      - Sven Rautenberg

  2. Aloha!

    ich habe eine Datenbank, bei der sind die Datensätze mit einem Feld ID nummeriert. Ich rufe das ganze dann immer mit ORDER BY ab. Nun hab ich so ein kleines Script geschrieben, in dem wird per INSERT INTO ein Datensatz angefügt.

    Zunächst einmal: Fummel nicht an der primären, eindeutigen ID einer Datenbank herum. Diese ID wird einmal im Leben vergeben und niemals mehr geändert. Anhand dieser ID kannst du immer eindeutig auf den Datensatz zugreifen - ihn z.B. auch löschen. Wäre dumm, wenn ein Browserfenster veraltete Daten hat und denkt, ID 5 wäre alt und muß weg, _nachdem_ ein anderes Browserfenster als ID 5 gerade einen neuen Datensatz eingefügt hat.

    Problem: Nun muss ich in einer for-Schleife (ach ja, hab ich ganz vergessen, ich verwende PHP) alle IDs, die größer sind als die ID des neuen Datensatzes um 1 hochzählen.

    Habe eine Spalte für diese Ordnungszwecke. Die kannst du dann belegen, wie du lustig bist, und auch sortieren lassen.

    Vor dem Insert mußt du wissen, welche Ordnungsnummer dein neuer Datensatz haben soll. Beispielsweise die Nummer 6. Schaffe dann Platz für den neuen Datensatz: Alle derzeitigen Ordnungsnummern, die 6 oder größer sind, müssen um 1 erhöht werden:

    UPDATE tabelle SET ordnungszahl=ordnungszahl+1 WHERE ordnungszahl >= 6;

    Danach hast du Platz für die neue Nummer 6:

    INSERT INTO tabelle (ordnungszahl) VALUES (6);

    Beim Löschen von Werten gehts genauso (nur andersherum):

    Stelle fest, welche Ordnungszahl dein Datensatz hat. Dann
    DELETE FROM tabelle WHERE id=eineID; (sicher ist sicher - siehe oben);
    Und zum Schluß:
    UPDATE tabelle SET ordnungszahl=ordnungszahl-1 WHERE ordnungszahl > gelöschterwert;

    - Sven Rautenberg

    1. Hallo,

      Beim Löschen von Werten gehts genauso (nur andersherum):

      [...]

      UPDATE tabelle SET ordnungszahl=ordnungszahl-1 WHERE ordnungszahl > gelöschterwert;

      Wobei ich denke, daß dieser Schritt nicht notwendigerweise gemacht werden muß, sofern man mit den Lücken leben kann. Für eine Sortierung ist es unerheblich, ob solche Lücken vorhanden sind oder nicht. Und für die Referenzierung sollte man dieses Feld sowieso nicht verwenden.

      Grüße
        Klaus

  3. Hallo,

    ich habe eine Datenbank, bei der sind die Datensätze mit einem Feld ID nummeriert. Ich rufe das ganze dann immer mit ORDER BY ab. Nun hab ich so ein kleines Script geschrieben, in dem wird per INSERT INTO ein Datensatz angefügt.
    Problem: Nun muss ich in einer for-Schleife (ach ja, hab ich ganz vergessen, ich verwende PHP) alle IDs, die größer sind als die ID des neuen Datensatzes um 1 hochzählen.

    Normalerweise vergibt man in so einem Falle für den nächsten Datensatz auch die nächst höhere ID, bzw. läßt das automatisch mit einem autoincrement-Feld erzeugen. Bei den ID's regelmäßige Änderungen vorzunehemen halte ich für keine so gute Idee, vor allem wenn noch andere Tabellen im Spiel sind (was bei relationalen Datenbanken fast immer der Fall ist), weil da die Beziehungen zu den anderen Tabellen schnell konfus werden. Das vor allem bei Datenbanken wie mySQL, die keine echten Beziehungen mit kaskadierten Updates kennen.

    Wenn Du schon eine numerierte Sortierung haben willst, solltest Du evenetuell der Tabelle ein eigens dafür vorgesehenes Feld spendieren.

    Also überleg Dir das mit dem ID-Verdrehen nochmals ganz genau.

    Gibt es nun eine einfachere Möglichkeit, das heißt, dass ich mit einem MySQL-Aufruf automatisch alle IDs hochzählen lassen kann, oder muss ich es bei der herkömmlichen Methode belassen?

    UDPATE tabelle
     SET feld=feld+1
     WHERE feld>=123

    wobei 123 eine willkürliche Zahl ist, die Du am besten mit dem Wert der aktuellen ID ersetzen solltest.
    Ach ja, noch etwas: Das solltest Du machen, _bevor_ Du den neuen Datensatz mit der ID 123 einfügst, da Du entweder den Dateensatz nicht speichern kannst (Index_verletzung) oder zwei Datensätze mit der gleichen ID bekommst, die dann beide um eins erhöht werden.

    http://www.mysql.com/doc/U/P/UPDATE.html

    (Dokumentationen sind nicht nur dazu da, um Speicherplatz zu verbrauchen;-)

    Grüße
      Klaus

    1. Hallo du da draußen,

      ja, das halte ich auch für den einfachsten Weg.

      Danke an alle!!!

      Grüße von hier drinnen, aus Biberach an der Riss,

      Dogfish