<gelöst>[SQL] Nach Insert in Tabelle mit Autowert, Autowert ermitteln...



  • Hallo,

    ich habe eine Tabelle in der ein Autowert ist.
    Beim Insert lass ich dann natürlich diesen Parameter weg.

    Nun will ich aber den Wert des zuletzt angelegten Autowertes erfahren.

    Wie geht das ?

    Folgende Möglichkeiten fallen schonmal weg:
    1. MAX() --> fällt flach, weil mehrere Leute auf die TAB zugreifen können.
    2. Identifikation anhand anderer Attribute --> Können gleiche vorkommen ...

    Ich brauche diesen Wert, weil ich ihn dann direkt danach in eine andere Tabelle eintragen muss. Kann man da nicht irgendwie tricksen 🙂



  • *Pppuuushshshsh*



  • Ich schätze das hängt von der Datenbank ab.
    Bei Firebird z.B. kann man das einfach per SELECT auf den Generator abfragen.



  • Eine Möglichkeit wäre, das INSERT innerhalb einer Transaction auszuführen und einen Isolationslevel zu wählen, der verhindert, dass Zugriffe von anderen Usern auf diese Tabelle erfolgen.
    Dann könntest du mit SELECT MAX(id) die Id ermitteln. Natürlich muss auch das SELECT innerhalb der Transaction ausgeführt werden.

    Auf Anwendungsebene könntest du mit Mutexen etc. arbeiten, um exclusiven Zugriff eines Benutzers zu erreichen, falls deine Anwendungsarchitektur dies zulässt. Dadurch wärst du db-unabhängig (Bei diesem Problem).



  • Hmmm, werde mir die Tipps mal genauer anschauen.

    DB: Microsoft SQL Server (Managment Studio Express)



  • Finten schrieb:

    Eine Möglichkeit wäre, das INSERT innerhalb einer Transaction auszuführen und einen Isolationslevel zu wählen, der verhindert, dass Zugriffe von anderen Usern auf diese Tabelle erfolgen.
    Dann könntest du mit SELECT MAX(id) die Id ermitteln. Natürlich muss auch das SELECT innerhalb der Transaction ausgeführt werden.

    Heißt das, das dann in dem Moment kein Zugriff auf die DB möglich ist.
    Das wäre ja schlecht 🙄

    Und MAX(id) gefällt mir auch nicht so besonders, weil:

    Kann es sein das wenn meine Tabelle ziemlich voll ist und ich mittendrin was lösche und dann eine neue Zeile einfüge, das er das dann mittendrin einfügt und ich somit mit MAX(id) was falsches bekommen würde ???



  • Freak_Coder schrieb:

    Finten schrieb:

    Eine Möglichkeit wäre, das INSERT innerhalb einer Transaction auszuführen und einen Isolationslevel zu wählen, der verhindert, dass Zugriffe von anderen Usern auf diese Tabelle erfolgen.
    Dann könntest du mit SELECT MAX(id) die Id ermitteln. Natürlich muss auch das SELECT innerhalb der Transaction ausgeführt werden.

    Heißt das, das dann in dem Moment kein Zugriff auf die DB möglich ist.
    Das wäre ja schlecht 🙄

    Und MAX(id) gefällt mir auch nicht so besonders, weil:

    Kann es sein das wenn meine Tabelle ziemlich voll ist und ich mittendrin was lösche und dann eine neue Zeile einfüge, das er das dann mittendrin einfügt und ich somit mit MAX(id) was falsches bekommen würde ???

    - Für den (idR) Bruchteil einer Sekunde/Millisekunde hat dann nur ein Benutzer zugriff auf die Datenbank. Natürlich sollten Transaktionen so kurz wie möglich sein. Ohne Zugriffssteuerung funktionieren Client-/Server-Systeme nunmal nicht.
    - Bei Autowerten werden normalerweise Lücken nicht ausgefüllt. D.h. der neue Wert ist der Maximalwert.



  • Danke für die Antworten, habe aber schon das richtige gefunden 😉

    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/tsqlref/ts_ra-rz_9oj7.asp


Anmelden zum Antworten