H2 Auto INC Primary Key & Insert

Letters90

Mitglied
Hi,

so sieht das create statement meiner tabelle aus:
Java:
public static void Create( Statement Stmt ) throws SQLException{
       Stmt.executeUpdate( "CREATE TABLE Tickets( TicketID INT PRIMARY KEY IDENTITY, KundenID INT, Kategorie VARCHAR(200), Prioritaet INT, Beschreibung VARCHAR(200), VorTicketID INT, Erstellt DATE, Abschluss VARCHAR(200) )" );
   }

so die frage die ich dazu jetzt habe, wenn ich über ein insert stmt einen wert einfüge wird dafür ein neuer primary key angelegt, gibt es einen eleganten weg diesen zum zeitpunkt der erstellung auszulesen?

ich kann mir denken das man einfach den letzten eintrag der tabelle auslesen könnte aber das scheint mir eine sehr unelegante lösung die dann aussetzt wenn mehrfach zugriffe auf eine datenbank stattfinden. oder muss ich den primary key doch programm intern selbst verwalten? ( das increment von hand programmieren )
 
Nope, das übernimmt die DB. Dabei wird nicht nach dem letzten Wert geschaut, sondern eine fortlaufende Nummer vergeben. Was aber nicht der Fall ist: es wird kein neuer PK angelegt. Jede Tabelle kann nur einen haben und der PK ist auch eigentl. mehr eine Regel mit speziellen Zusätzen (erlaubt das setzen von Foreignkeys auf ein Feld, was mit normalen Constraints afaik nicht möglich ist). Das was für dich atm interessant ist, ist einfach: der PK definiert dass das Feld (hier:TicketID) eindeutig sein muss. Ein Insert mit einer bestehenden ID wäre somit nicht möglich.
 
so die frage die ich dazu jetzt habe, wenn ich über ein insert stmt einen wert einfüge wird dafür ein neuer primary key angelegt, gibt es einen eleganten weg diesen zum zeitpunkt der erstellung auszulesen?

ich glaube ich habe mich nicht deutlich ausgedrückt. ich führe ein insert aus und mein problem dabei ist das ich nach dem insert nicht den wert des PK in meinem programm habe und einen eleganten weg suche den PK für den neuen eintrag auszulesen.
 
Wieso willst du den vorher auslesen? Ich würde eher abfragen welche ID zuletzt generiert wurde über die offene Verbindung. Wenn du vorher schon die ID abfragst kann es passieren das zwischenzeitlich noch ein Insert ausgeführt wird. Dann wäre die ID die du erfragt hast nutzlos.

H2 hat doch sicher auch schema_information Tabellen oder? Bei MySQL kann man über die Tabellen den nächsten auto increment Wert abfragen.
 
Du kannst dir ja den letzten Eintrag in der Tabelle holen. Der letzte Datensatz hat im autoinc-Feld immer den höchsten Wert. Wenn du mit zeitgleichen Zugriffen rechnest, dann kannst du ja in deinen Select noch die Felder im Where-Clause angeben, die du im Insert gefüllt hast.

Select absetzen, nach autoinc absteigend-Sortieren, ggf weitere Bedingungen im Where-Clause angeben und erstes Ergebnis nehmen. Das sollte dein Eintrag sein.
 
und wie geht das 🙂?

Das sind ganz normale Tabellen die du über SQL abfragen kannst.
[sql]
SELECT `AUTO_INCREMENT` FROM information_schema.`TABLES`
WHERE `TABLE_SCHEMA` = 'NAME_MEINER_DATENBANK'
AND `TABLE_NAME` = 'NAME_MEINER_TABELLE';[/sql]

In den Information Schemes stehen alle Informationen zu jeder erzeugten Struktur. Denn MySQL muss auch irgendwie wissen wie die Tabellen aufgebaut sind, wenn man zb. den bösen * nutzt 😉
 
Zuletzt bearbeitet:
Javadoc Statement, funktioniert natürlich auch mit PreparedStatement:
getGeneratedKeys

public ResultSet getGeneratedKeys()
throws SQLException

Retrieves any auto-generated keys created as a result of executing this Statement object. If this Statement object did not generate any keys, an empty ResultSet object is returned.

Returns:
a ResultSet object containing the auto-generated key(s) generated by the execution of this Statement object
Throws:
SQLException - if a database access error occurs
Since:
1.4
 
Vielen dank bertor, das war genau das was ich gesucht habe !

hier die erfolgreiche implementation:

Java:
public void Insert( ) throws SQLException{
       Stmt.executeUpdate("INSERT INTO Kunden ( Name, Nachname, Raum, Telefonnummer ) VALUES ( '" + Name + "', '" + Nachname + "', '" + Raum + "', '" + Telefonnummer + "' )", Statement.RETURN_GENERATED_KEYS );
       ResultSet Res = Stmt.getGeneratedKeys();
       Res.next();
       int PK = Res.getInt("KundenID");
   }
 

Zurück
Oben