2010-12-19 15 views
8

Używam Java (jdbc) do interakcji z bazą danych MySQL. Mam tabelę z głównym indeksem, który jest AUTO INCREMENT. Kiedy wstawiam wiersz, potrzebuję uzyskać indeks, który właśnie otrzymał. Jak mogę to zrobić?Uzyskiwanie indeksu wstawionych wierszy z bazy danych MySQL

+0

Jak wykorzystać ten indeks, aby szybciej wyszukiwać szybciej? – David

+2

@ David: co masz na myśli? Klucz podstawowy jest zawsze indeksem, a zatem zawsze pomoże szybciej wyszukiwać, jeśli zapytanie dotyczy indeksu. Zadaj osobne pytanie, jeśli chcesz więcej wyjaśnień :) – Konerak

+0

Myślałem, że klucz podstawowy może być indeksowany i nie jest indeksem sam w sobie. Uważam, że jest to całkowicie poprawne (choć zazwyczaj niezalecane) używanie varcharu (60) jako klucza podstawowego. Interesujące byłoby wówczas pobranie indeksu klucza podstawowego, który właśnie został wstawiony, a nie samej wartości. Dokładniej, byłoby przydatne, aby uzyskać jakąś pozycję na dysku, na którym przechowywany był ostatni rekord, aby można było go szybko zmodyfikować, jeśli okaże się, że powinien on zostać zmodyfikowany (na przykład z powodu kliknięcia przez użytkownika przycisku cofania) . Mam nadzieję, że teraz nie uprowadzam tego bieżnika ... – David

Odpowiedz

7

Od: 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

Alternatywnie, przy użyciu Wiosna JDBC to będzie wyglądać:

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

Dzięki John Boker za doskonałą odpowiedź.

Jeśli chcesz użyć PreparedStatement, można nadal korzystać RETURN_GENERATED_KEYS, ale trzeba zastosować polecenia inaczej:

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. Dodaj RETURN_GENERATED_KEYS param w funkcji prepareStatement() .
  2. Uzyskaj wyniki nie od statement.executeUpdate(), ale od statement.getGeneratedKeys().
Powiązane problemy