bjbender: Gibt es eine Alternative zu SELECT MAX(ID) FROM Tabellenname

Hallo alle Miteinander,

folgende Frage kennt einer eine Alternative zu:

SELECT MAX(ID) FROM Tabellenname

Ich habe eine Test Seite auf meinem Localhost laufen. Welche via einem Formular mit Werten gefüllt werden kann. Auf der nächsten Seite werden die Werte abgerufen. Es soll aber immer der Letzte Wert abgerufen werden deswegen Nutze ich SELECT MAX ... . Damit immer die Aktuellen Werte wiedergegeben werden wird die Seite alle 3min refresht. Das funktioniert dann auch 1-2 mal aber dann freezt die Werte anzeige und zeigt nicht mehr den aktuellen wert an.

Vielleicht hat ja jemand von euch eine Idee.

Mit freundlichen Gruß

bjbender

  1. Hello,

    jein.

    Es gibt den Blick (select) in das information_schema. Dort steht für jede Tabelle die nächste vorgesehene Autoincrement-ID drin.

    SELECT AUTO_INCREMENT 
    FROM information_schema.tables 
    WHERE table_name = 'table_name' 
    AND table_schema = DATABASE( ) ;
    

    Glück Auf
    Tom vom Berg

    --
    Es gibt nichts Gutes, außer man tut es!
    Das Leben selbst ist der Sinn.
    1. Danke für deine Antwort,

      mein Problem wäre dann die Tabellen Konstellation, da ich eine Tabelle habe wo alle werte in einer reihe in verschiedenen Zellen gespeichert werden. Und diese so dann auch die gleiche ID haben. Hat vielleicht einer eine Idee warum die Tabellen Ausgabe freezt?

      Mit freundlichen Grüßen

      bjbender

      1. Hello,

        was macht die Ausgabe?

        Glück Auf
        Tom vom Berg

        --
        Es gibt nichts Gutes, außer man tut es!
        Das Leben selbst ist der Sinn.
  2. Hallo bjbender,

    das wird nicht am SELECT allein liegen. Hier hilft nur Logging und Debugging, und genaues Nachdenken über die SQL-Statements, die im Verlaufe der Web-Requests abgesetzt werden.

    Ein SELECT MAX(ID) kann auf zwei Arten laufen. Ist die ID erstes Feld eines Index, kann die Abfrage mit einem reinen Indexzugriff befriedigt werden. Ist sie in einem Index, aber nicht erstes Feld, macht der SQL Server entweder einen Index- oder Table-Scan. Und der kann hängenbleiben, wenn ein parallel laufendes Script einen Lock auf die Table hält (UPDATE, INSERT oder DELETE hinterlassen sowas).

    Wenn du vor dem SELECT MAX(ID) noch einen anderen UPDATE gemacht hast, kann es zum Deadlock kommen (Script A wartet auf Script B und B wartet auf A). Sowas wird vom SQL Server typischerweise nach 2-3 Minuten abgebrochen und als entsprechender SQL Fehler an den Aufrufer gemeldet.

    Dass es ein Deadlock ist, d.h. dass ein SQL Statement hängenbleibt, musst Du Dir aber erstmal beweisen. Dazu ist auch die Frage wichtig, welche Storage Engine Du einsetzt (wenn Du MySQL verwendest): InnoDB oder MyISAM? Das Lockingverhalten ist unterschiedlich, lies das im Handbuch nach. Bei InnoDB kannst Du über innodb_lock_wait_timeout (mit SET SESSION) die Wartezeit beeinflussen, bis ein Deadlock angenommen wird.

    Aber vielleicht bricht ja auch was anderes ab. Die Möglichkeiten sind vielfältig. Produziert JavaScript oder PHP einen Fehler? Was loggst Du? Was steht in der Browserkonsole?

    Rolf

    --
    sumpsi - posui - clusi
  3. Hallo bjbender,

    Es soll aber immer der Letzte Wert abgerufen werden deswegen Nutze ich SELECT MAX ... .

    Die größte ID muss nicht die zuletzt eingefügte sein. DBMS können auch Lücken auffüllen. Wenn du das möchtest, solltest du deinen Datensätzen den aktuellen Timestamp mitgeben.

    MAX ist möglicherweise auch recht teuer.

    SELECT `col1`, `col2` from `table`
    ORDER BY `timestamp`
    LIMIT 3
    

    Bis demnächst
    Matthias

    --
    Du kannst das Projekt SELFHTML unterstützen,
    indem du bei Amazon-Einkäufen Amazon smile (Was ist das?) nutzt.
    1. Danke für eure Antworten habe gerade eben eine eigene Lösung erarbeitet welche jetzt perfekt ohne Fehler Funktioniert.

      1. Hallo bjbender,

        Danke für eure Antworten habe gerade eben eine eigene Lösung erarbeitet welche jetzt perfekt ohne Fehler Funktioniert.

        Vielleicht magst du sie ja hier mitteilen, sie könnte schließlich auch für andere hilfreich sein.

        Bis demnächst
        Matthias

        --
        Du kannst das Projekt SELFHTML unterstützen,
        indem du bei Amazon-Einkäufen Amazon smile (Was ist das?) nutzt.