Matthias: Gerade generieren Primary Key ermitteln

Hallo,

kann mit Java... Nein, das geht bestimmt nur wie!?
Ich schreibe bestimmte Daten in eine MySQL Datenbank mit Java und
der Primary Key wird in dieser Tabelle über "auto_increment" erzeugt.
Nun möchte ich, sofort nach dem schreiben in die DB, diesen Wert
ermitteln. Wie macht man das? Hab noch nichts gefunden und such in
der Zwischenzeit weiter...

Danke.

  1. Hallo Matthias,

    du hast 2 Möglichkeiten:
    entweder machst du einen neuen Zugriff auf die Datenbank und liest die ID wieder aus. Dann brauchst du allerdings ein eindeutiges Feld, das nicht doppelt vorkommt
    oder
    du berechnest die ID selber bevor du den Datensatz einliest
    mit MAX(ID) + 1. Hier solltest du dir allerdings Gedanken über konkurrierende Zugriffe machen.

    Gruß Lena

  2. moin Matthias :)

    Ich schreibe bestimmte Daten in eine MySQL Datenbank mit Java und
    der Primary Key wird in dieser Tabelle über "auto_increment" erzeugt.
    Nun möchte ich, sofort nach dem schreiben in die DB, diesen Wert
    ermitteln. Wie macht man das?

    versuchs mal mit getGeneratedKeys().
    Wahlweise kannst du auch alle Primary Keys auslesen und dir den letzten rausfischen.

    liebe Grüße aus Berlin
    lina-

    --
    Self-Code: ie:% fl:( br:^ va:) ls:/ fo:| rl:( ss:) de:] js:| mo:)
    1. Was ist denn an dieser Antwort nicht hilfreich? Nach Blick in die Doku scheint das genau die richtige Weg mit Java zu sein. Der JDCB-Treiber für MySQL dahinter wird das dann sicher richtig machen.

      Grüße

      Daniel

      1. moin Daniel :)

        Was ist denn an dieser Antwort nicht hilfreich? Nach Blick in die Doku scheint das genau die richtige Weg mit Java zu sein. Der JDCB-Treiber für MySQL dahinter wird das dann sicher richtig machen.

        Was halt mit "nicht hilfreich" gemeint ist, ist die Tatsache, dass beim rausfischen des letzten primary keys durchaus schon andere erstellt worden sein könnten.
        Da hat ja Sven gar nicht so unrecht und ich hab nicht dran gedacht.
        Ich frag mich nur, wer der 2. war ;)

        Was ausserdem unverschämt finde, ist dass er für eine Antwort, die nicht mal zum Ziel geführt hat ("aber da ich Java nicht kenne, wirst du selbst mal in die Doku schauen müssen") ein hilfreich bekommt... und Lenas und meine Antwort nur rudimentär berichtigt wurde.

        liebe Grüße aus Berlin
        lina-

        --
        Self-Code: ie:% fl:( br:^ va:) ls:/ fo:| rl:( ss:) de:] js:| mo:)
        1. Hallo lina,

          Was halt mit "nicht hilfreich" gemeint ist, ist die Tatsache, dass beim rausfischen des letzten primary keys durchaus schon andere erstellt worden sein könnten.

          Das ist bei Lenas Ansatz so, aber zu "getGeneratedKeys()" steht ja in der Dokumentation: "Retrieves any auto-generated keys created as a result of executing this Statement object." Es sind also die Keys, die eben genau durch dieses Statement erzeugt wurden. Ich würde vermuten, dass da im Falle von MySQL intern auch nur last_insert_id() oder sowas verwendet wird. Mehrere Keys können es vermutlich sein, falls ein Statement gleich mehrere Datensätze erzeugt.

          ("aber da ich Java nicht kenne, wirst du selbst mal in die Doku schauen müssen") ein hilfreich bekommt...

          Seine Antwort ist dennoch hilfreich. Ein SELECT last_insert_id(); klappt schließlich unabhängig von der Programmiersprache, dafür dürfte es MySQL-Spezifisch sein. Wenn ich die Dokumentation richtig verstanden habe, ist daher Deine Lösung die für Java vorzuziehende.

          Grüße

          Daniel

          1. moin Daniel :)

            Das ist bei Lenas Ansatz so, aber zu "getGeneratedKeys()" steht ja in der Dokumentation: "Retrieves any auto-generated keys created as a result of executing this Statement object." Es sind also die Keys, die eben genau durch dieses Statement erzeugt wurden. Ich würde vermuten, dass da im Falle von MySQL intern auch nur last_insert_id() oder sowas verwendet wird. Mehrere Keys können es vermutlich sein, falls ein Statement gleich mehrere Datensätze erzeugt.

            Richtig.
            Aber ich hatte ja auch noch vorgeschlagen, wahlweise alle primary keys auszulesen und den letzten zu nehmen. Das ist einfach falsch.

            liebe Grüße aus Berlin
            lina-

            --
            Self-Code: ie:% fl:( br:^ va:) ls:/ fo:| rl:( ss:) de:] js:| mo:)
        2. Was halt mit "nicht hilfreich" gemeint ist, ist die Tatsache, dass beim rausfischen des letzten primary keys durchaus schon andere erstellt worden sein könnten.

          Hi Lina,

          auf diese Problematik habe ich schon hingewiesen mit dem Hinweis auf konkurrierende Zugriffe. Sven hat also lediglich breiter ausgeführt, was ich schon geschrieben habe. Das wäre sicher auch in den Griff zu kriegen, aber da es offenbar viel einfachere Lösungen gibt (z.B. deine:-)) ist der Vorschlag tatsächlich nicht so gut.

          Da hat ja Sven gar nicht so unrecht und ich hab nicht dran gedacht.
          Ich frag mich nur, wer der 2. war ;)

          Wenn einer von den zweien Sven war, dann frage ich mich, wer Svens Antwort 2 mal als hilfreich bewertet hat. Es wird sich doch wohl hier niemand selber bewerten??!

          Gruß Lena

  3. Moin!

    Nun möchte ich, sofort nach dem schreiben in die DB, diesen Wert
    ermitteln. Wie macht man das?

      
    SELECT LAST_INSERT_ID()  
    
    

    Die MySQL-API bietet dafür auch eine Funktion an, die stattdessen aufgerufen werden kann, aber da ich Java nicht kenne, wirst du selbst mal in die Doku schauen müssen. Das Stichwort ist dasselbe.

    Ach ja, noch eines: Ignoriere bitte alle anderen Tipps, die dir versuchen einzureden, man könne irgendwie das bisherige Maximum der IDs nehmen oder sonst etwas. In jetzigen Versionen von MySQL mag das eventuell klappen, weil auto_increment tatsächlich immer 1 addiert. Das Verfahren zur Vergabe von neuen IDs kann sich aber grundsätzlich auch mal ändern, und außerdem ist ein INSERT und ein nachfolgendes SELECT MAX(id) nicht atomar! Wenn in der Zeit zwischen den Querys jemand anderes neue Datensätze einfügt, erhälst du deren ID.

    LAST_INSERT_ID() hingegen basiert auf der letzten INSERT-Operation der aktiv benutzten MySQL-Verbindung und liefert garantiert die richtige ID - auch wenn parallel andere Verbindungen jeweils andere neue IDs generieren.

    - Sven Rautenberg

    --
    My sssignature, my preciousssss!