1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

MySql: auto-increment in Abhängigkeit von anderem Feld

Dieses Thema im Forum "Relationale Datenbanksysteme" wurde erstellt von Sprint, 14. Februar 2017.

  1. Sprint

    Sprint Erfahrenes Mitglied

    Hallo zusammen,

    ich habe aktuell folgendes Problem. In eine einfache Tabelle sollen Veranstaltungsteilnehmer eingetragen werden. Als ID wird ein auto-increment Feld verwendet. So weit so gut.

    Wenn jetzt aber die Anmeldungen für die nächste Veranstaltung kommen, erhalten die natürlich weiterhin fortlaufende Nummern, so daß die in einer Übersichtsliste mit irgendwelchen Nummern gelistet werden, aber nicht mit ihrer "richtigen" Nummer, die der Nummer ihrer Anmeldung für das aktuelle Event entspricht. Die erste Anmeldung soll nun mal die Nummer 1 bekommen und nicht z.B. die 49.

    Jetzt suche ich eine Möglichkeit, die laufende Teilnehmernummer über ein auto-increment Feld zu vergeben, das von einem anderen Feld, z.B. der Nummer oder dem Datum der Veranstaltung, abhängig ist. Das würde bedeuten, daß Zahlen mehrfach vorkommen können, in Verbindung mit dem anderen Feld aber immer eindeutig sind. Im Moment fällt mir dazu nur ein, ein normales Feld zu nutzen und über max() den bisher höchsten Wert auszulesen, zu erhöhen und nachträglich den neuen Wert in den aktuellen Datensatz einzufügen. Wäre zwar möglich, aber umständlich und nicht wirklich sicher.

    Ich hoffe, ich konnte das einigermaßen verständlich machen und habt da einen Tip für mich.

    LG, Sprint
     
  2. Yaslaw

    Yaslaw n/a Moderator

    Trenne die technische ID und das was du anzeigst. Also 2 Felder.
    ID (AutoIncrement)
    ANMELDE_NR (Nummer)

    Du solltest niemals die technische ID für irgendwelche Schöndarstellungen missbrauchen.

    Dann kannst die beim INSERT es etwa so lösen. Achtung, ist nur ein Gedanke, keine fertige Lösung
    Code (SQL):
    1. INSERT INTO teilnehmer (
    2.     anmelde_nr,
    3.     event_id,
    4.     user_name
    5. )
    6. VALUES(
    7.     (
    8.         SELECT  IFNULL(MAX(anmelde_nr), 0) + 1
    9.         FROM    teilnehmer
    10.         WHERE   event_id = 11
    11.     ),
    12.     11,
    13.     'Hans Muster'
    14. );
    oder
    Code (SQL):
    1. INSERT INTO teilnehmer (
    2.     anmelde_nr,
    3.     event_id,
    4.     user_name
    5. )
    6. SELECT  
    7.         IFNULL(MAX(anmelde_nr), 0) + 1  AS anmelde_nr,
    8.         11 AS event_id,
    9.         'Hans Muster' AS user_name
    10. FROM    teilnehmer
    11. WHERE   event_id = 11
     
    Sprint gefällt das.
  3. sheel

    sheel I love Asm Administrator

    Hi

    Weil...? Race conditions? => Transactions.
     
  4. Sprint

    Sprint Erfahrenes Mitglied

    @sheel: Mit sicher meinte ich die Möglichkeit, daß bei gleichzeitiger Anmeldung was durcheinander kommt. Hatte ich früher schon mal erlebt.

    @Yaslaw: Das zweite Muster, muß ich gestehen, verstehe ich nicht, aber mit dem ersten kann ich wohl was anfangen. Vielen Dank für die schnelle Hilfe.
     
  5. sheel

    sheel I love Asm Administrator

    Ja, das hatte ich auch gemeint. Lösung: Transactions.
     
    Sprint gefällt das.
  6. Sprint

    Sprint Erfahrenes Mitglied

    So, hab das jetzt mal ausprobiert. Die Lösung von Yaslaw habe ich leider doch nicht hinbekommen. Ich habe immer die Fehlermeldung bekommen, daß die Verwendung der Zieltabelle in dem Statement nicht erlaubt sei.

    Hab es dann über Transactions gelöst. Die extra Abfrage nach der letzten max. Nummer läßt sich ja eh nicht vermeiden.
     
Die Seite wird geladen...