Announcement

Collapse
No announcement yet.

Zahlenlücken bei id's Auffüllen bei Insert

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Zahlenlücken bei id's Auffüllen bei Insert

    Hallo Miteinander

    Ich habe eine Datenbank mit so einer Tabellenstruktur:

    PHP Code:
    CREATE TABLE `Filme` (
      `
    idint(11NOT NULL AUTO_INCREMENT,
      `
    Titelvarchar(255NOT NULL DEFAULT '--',
      
    PRIMARY KEY (`id`)
    ENGINE=MyISAM AUTO_INCREMENT=759 DEFAULT CHARSET=utf8
    Wir haben bei Einfügen von Daten manchmal was rauslöschen müssen, dadurch veränderte sich aber natürlich der Auto Increment nicht und es entstanden dadurch lücken in der Spalte "id" der Datensätze.

    Zum Beispiel: 1, 2, 4, 6, 9, ...

    Die leeren Stellen möchte ich aber bei meinen weiteren INSERT Befehlen automatisch auffüllen lassen.

    Ich habe gegoogelt und probiert zuerst das Zurücksetzen des Autoincrements vor dem INSERT, oder MIN(id) befehle, habe es einfach nicht hinbekommen.

    Schön wäre es auch diese Lücke bzw. diese Freie Zahl vorher schon auszugeben bevor ich einen neuen INSERT Eintrag mache.

    Gibt es dafür einen einfachen Skript? Oder eine funktion der die Tiefste Freie Zahl ganz einfach Ausliest?

    Danke schon im Voraus!

  • #2
    Nicht böse sein, aber ich habe in meinen jetzt doch schon über 20 Jahren mit Datenbanken noch keinen einzigen Fall gesehen, wo so etwas Sinn gemacht hätte. Besser du vergisst das ganz schnell wieder oder kannst einen triftigen Grund angeben, was das ganze bringen soll.

    bye,
    Helmut

    Comment


    • #3
      Hi Helmut. Dann erläutere ich mein Beispiel ein bisschen mehr.

      Diese IDs sind gleichzeitig unsere Filmnummern. Den Hüllen haben wir Stickers versehen mit deren ID Nummern aus der MySQL Datenbank. Stellt es euch so ähnlich vor wie in einer*Videothek. Von mir aus kann ich eine zusätzliche Nummerierungsspalte programmieren die nicht mehr IDs heißt. die ID Spalte kann ich dann so belassen wie es ist. Trotzdem fehlt mir dann immer noch die Funktion in der Filmnummer Spalte die automatische Auffüllung der tiefsten freien Nummer.

      Comment


      • #4
        Trotzdem fehlt mir dann immer noch die Funktion in der Filmnummer Spalte die automatische Auffüllung der tiefsten freien Nummer.
        Liegt daran, weil eine solche nicht existiert, d.h. du musst die entsprechende Stored Function selbst implementieren.
        Einfacher wäre es Aufkleber für die Videohüllen zu besorgen und die Nummern neu zu vergeben.
        Bei SQL-Code bitte beachten: Formatierung von SQL in Beiträgen

        Comment


        • #5
          Die Fächer selbst sind eben auch angeschrieben.

          Kannman evt. ein SELECT Script schreiben das zum Beispiel:
          Spalte 1 vergleicht Spalte 2
          Nur zahlen und zwar beginnend ab 1 aufwärts.
          Bei der ersten Unübereinstimmung (!=) soll es dessen den wert von Spalte 1 ausgeben.

          Kann man das machen?

          Comment


          • #6
            Geht schon, nur ob sich der Aufwand lohnt.

            Suche einfach nach sql lücke finden

            Edit: btw. wenn du wirklich die "Hüllen vornummeriert" hast, dann erstelle eine Platztabelle in der du die verfügbaren Plätze vergeben kannst, zusätzlich hast du halt die Spalte belegt/nicht_belegt.
            Zuletzt editiert von dibo33; 28.01.2012, 22:36.
            Bei SQL-Code bitte beachten: Formatierung von SQL in Beiträgen

            Comment


            • #7
              ich würde das anders machen: in der Datenbank werden alle möglichen Filmnummern angelegt. Wird eine Filmnummer verwendet, dann steht zumindest der Filmtitel im Datensatz. Wird nun ein Film verloren, vernichtet, ausgeschieden oder was immer und dadurch die Filmnummer frei, dann wird zumindest der Filmtitel gelöscht, aber der Datensatz selber bleibt. Da könnte man dann mit "select min(filmnummer) where titel is null" ganz leicht immer die kleinste freie filmnummer kriegen.

              bye,
              Helmut

              Comment


              • #8
                Hallo,
                Originally posted by Publisher View Post
                ...Diese IDs sind gleichzeitig unsere Filmnummern.
                Sowas passiert eben, wenn man für den PK Nutzdaten oder andersherum einen technischen Schlüssel als Nutzdaten verwendet. Hier sollte IMMER eine Trennung erfolgen. Also als Erstes: eine separate Spalte für die Filmnummer anlegen!

                Zudem ist es in einer Mehrbenutzerumgebung immer problematisch, fortlaufend lückenlose Nummern zu vergeben. Klassisches Szenario: NutzerA legt einen Film an und holt dazu eine Nummer. Während A noch am Tippen ist, legt Nutzer B ebenfalls einen Film an und holt sich die nächste Nummer. Nutzer A bricht jetzt seine Eingabe ab und verwirft den angelegten Film. Wenn Nutzer B seine Eingabe speichert hast du eine Lücke! Füllst du die Lücken im Nachhinein, dann entsteht das Paradoxon, dass "Neuere" Filme Nummern bekommen können, die vor den Nummern "älterer" Filme liegen. Es muss also eindeutig festgelegt sein, worauf hier die Prio liegt, darauf dass die Nummern einfach nur fortlaufend sind (was i.a.R. ausser schön sein keinen weiteren Sinn hat) oder ob daraus auch eine Chronologie erkennbar sein soll.
                In Systemen in denen beides wichtig ist (z.B. bei Rechnungen) werden solche Nummern daher explizit vergeben und zwar zu einem Zeitpunkt ab dem der DS geprüft ist und danach eben nicht mehr verworfen oder gelöscht werden kann. D.h. ein Film wird zunächst OHNE Nummer (jedoch mit ID) angelegt und kann beliebig bearbeitet oder auch wieder verworfen werden. Ab dem Zeitpunkt ab dem der Nutzer sagt: "Daten OK, Nummer vergeben", wird die nächste Nummer genommen und diesem Film zugewiesen und der Film ist damit "aktiv".

                Gruß Falk
                Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

                Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

                Comment


                • #9
                  gibt es nicht so eine rownumber funktion?

                  [highlight=sql]
                  SELECT *, ROWNUMBER() as AufsteigendNummernOhneLuecken
                  FROM Filme
                  ORDER BY ID
                  [/highlight]

                  Das würde Dir ganz einfach eine aufsteigende Nummer geben wenn Du nach ID sortierst. Heisst die ID ist dann ganz egal (solange filme nur mit einer höheren ID hinzugefügt werden als die alten).
                  Ich weiss allerdings nicht ob es in MySQL so eine Funktion gibt. Das funktioniert natürlich nur bei einem SELECT auf die ganze Tabelle. Inwiefern sich das allerdings auf teil selects auswirkt weiss ich leider auch nicht. Evtl. muss man noch ein View davor bauen oder etwas in der Art. Alternativ könnte man auch bei jedem Insert ein UPDATE fahren was die Nummer berechnet.

                  Comment


                  • #10
                    @Publisher: Bitte stelle Fragen die sich mit PHP-Problemen beschäftigen auch im PHP-Forum. Mit einem Monster-Thread zu X Problematiken ist niemandem geholfen. Dein PHP-Problem hat nichts mehr mit der ursprünglichen Frage zu tun!

                    Ich habe die PHP-Beiträge in einen neuen Thread verschoben: MySQL-Abfrage auf tiefste freie Zahl bringt in PHP kein Ergebnis

                    Gruß Falk
                    Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

                    Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

                    Comment

                    Working...
                    X