2010-12-19 17 views
8

Ich verwende Java (jdbc), um mit einer MySQL-Datenbank zu interagieren. Ich habe Tabelle mit einem primären Index, der AUTO INCREMENT ist. Wenn ich eine Zeile einfüge, muss ich den Index erhalten, den er gerade erhalten hat. Wie mache ich das?Index von eingefügten Zeilen aus einer MySQL-Datenbank abrufen

+0

Wie können Sie diesen Index verwenden, um schneller laster zu suchen? – David

+2

@David: was meinst du? Ein Primärschlüssel ist immer ein Index und hilft daher immer schneller zu suchen, wenn Sie den Index abfragen. Stellen Sie eine separate Frage, wenn Sie mehr Erklärungen wünschen :) – Konerak

+0

Ich dachte, dass ein Primärschlüssel indiziert werden könnte und kein Index für sich ist. Ich glaube, dass es vollkommen gültig ist (obwohl normalerweise nicht empfohlen), ein varchar (60) als Primärschlüssel zu verwenden. Es wäre dann interessant, den Index des Primärschlüssels, der gerade eingefügt wurde, und nicht den Wert selbst abzurufen. Genauer gesagt wäre es nützlich, eine Position auf der Platte zu erhalten, auf der der letzte Datensatz gespeichert war, so dass man ihn schnell ändern kann, wenn sich herausstellt, dass er geändert werden sollte (zum Beispiel weil der Benutzer auf eine Schaltfläche zum Rückgängigmachen klickt). . Hoffe, dass ich dieses Profil jetzt nicht entführe ... – David

Antwort

7

Von: http://dev.mysql.com/doc/refman/5.0/en/connector-j-usagenotes-basic.html#connector-j-usagenotes-last-insert-id

stmt.executeUpdate(
     "INSERT INTO autoIncTutorial (dataField) " 
     + "values ('Can I Get the Auto Increment Field?')", 
     Statement.RETURN_GENERATED_KEYS); 

// 
// Example of using Statement.getGeneratedKeys() 
// to retrieve the value of an auto-increment 
// value 
// 

int autoIncKeyFromApi = -1; 

rs = stmt.getGeneratedKeys(); 

if (rs.next()) { 
    autoIncKeyFromApi = rs.getInt(1); 
} else { 

    // throw an exception from here 
} 

rs.close(); 

rs = null; 
0

Alternativ ist es Frühling JDBC mit aussehen würde:

Map<String, Object> map = new HashMap<String, Object>(); 
map.put("column1", "test"); 
map.put("column2", Boolean.TRUE); 

SimpleJdbcInsert insert = new SimpleJdbcInsert(template).withTableName("table").usingGeneratedKeyColumns("id"); 
int id = insert.executeAndReturnKey(map).intValue(); 
2

Dank für seine hervorragende Antwort auf John Boker.

Wenn Sie eine PreparedStatement nutzen möchten, können Sie immer noch RETURN_GENERATED_KEYS verwenden, aber Sie müssen die Befehle gelten anders:

PreparedStatement ps = mysql.prepareStatement(
    "INSERT INTO myTable (colA, colB, colC) VALUES (?, ?, ?)", 
    Statement.RETURN_GENERATED_KEYS); 
ps.setString(1, "My text"); 
ps.setTimestamp(2, new java.sql.Timestamp(new java.util.Date().getTime());); 
ps.setInt(3, 5150); 
ps.executeUpdate(); 
ResultSet results = ps.getGeneratedKeys(); 
results.next(); // Assume just one auto-generated key; otherwise, use a while loop here 
System.out.println(results.getInt(1)); // there should only be 1 column in your results: the value of the auto-generated key 
  1. Fügen Sie den RETURN_GENERATED_KEYS param in der prepareStatement() Funktion.
  2. Ergebnisse nicht von statement.executeUpdate() sondern von statement.getGeneratedKeys().
Verwandte Themen