2010-11-22 5 views
75

가능한 중복의 ID를 가져옵니다 :
How to get the insert ID in JDBC?MySQL을 & 자바 - 마지막 삽입 값 (JDBC)

안녕, 나는 자바에서를 통해 데이터베이스에 연결하기 위해 JDBC를 사용하고 있습니다.

이제 삽입 쿼리를 수행하고 마지막으로 삽입 한 값 (예 : stmt.executeUpdate)의 ID를 가져와야합니다.

동시성 문제가있을 수 있으므로 SELECT id FROM table ORDER BY id DESC LIMIT 1과 같은 것이 필요하지 않습니다.

난 마지막 삽입 (내 진술의 인스턴스에 관한)과 관련된 ID를 검색하면됩니다.

나는이 시도하지만, JDBC에서 작동하지 않는 것 같다 : 사실

public Integer insertQueryGetId(String query) { 
    Integer numero=0; 
    Integer risultato=-1; 
    try { 
     Statement stmt = db.createStatement(); 
     numero = stmt.executeUpdate(query); 

     ResultSet rs = stmt.getGeneratedKeys(); 
     if (rs.next()){ 
      risultato=rs.getInt(1); 
     } 
     rs.close(); 

     stmt.close(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
     errore = e.getMessage(); 
     risultato=-1; 
    } 
    return risultato; 
} 

마다 risultato = -1을, 나는이 문제를 해결할 수있는 방법은

java.sql.SQLException: Generated keys not requested. You need to specify Statement.RETURN_GENERATED_KEYS to Statement.executeUpdate() or Connection.prepareStatement().를 얻을? 덕분에 유래 사람들 :

+0

내 질문보기 : http://stackoverflow.com/questions/4224228/preparedstatement-with-statement-return-generated-keys –

+0

[JDBC에서 삽입 ID를 얻는 방법]이 중복되었습니다. (http : // stackoverflow .com/questions/1915166/how-to-get-the-insert-id-in-jdbc) – BalusC

답변

147

당신은 변하지 않을 것입니다 :

numero = stmt.executeUpdate(query); 

에 :

numero = stmt.executeUpdate(query, Statement.RETURN_GENERATED_KEYS); 

는 JDBC Statement 인터페이스에 대한 설명서를 살펴 보자.

업데이트 : 분명히이 답변에 대한 많은 혼란이 있습니다. 그러나 내 생각에 혼란스러워하는 사람들은 묻는 질문의 맥락에서 그것을 읽지 않습니다. OP가 자신의 질문에서 제공 한 코드를 사용하고 내가 제안하는 한 줄 (6 번 줄)을 대체하면 모든 것이 효과적 일 것입니다. numero 변수는 완전히 관련이 없으며 값을 설정 한 후에는 읽지 않습니다.

Statement stmt = db.prepareStatement(query, Statement.RETURN_GENERATED_KEYS); 
numero = stmt.executeUpdate(); 

ResultSet rs = stmt.getGeneratedKeys(); 
if (rs.next()){ 
    risultato=rs.getInt(1); 
} 

을하지만 시나리오 대신 숀 밝은의 답변을 사용

+1

너 락! Heheh,이 경고 메시지를 읽을 수 없으므로 :) – markzzz

+1

+1 RETURN_GENERATED_KEYS에 대한 – bizzr3

+0

예, 이건 실제로 작동하지 않습니다. 두 개의 레코드를 삽입하고, 모두 삭제하고 (TRUNCATE는 아님) 올바른 ID가 검색되었는지 확인하십시오.) – Pierre

108

또는 당신은 할 수 있습니다.

+0

대단히 고마워요! 나는 이것이 JDBC를 사용하여 가능하다는 것을 몰랐다. 테이블에 여러 행을 삽입 할 때 생성 된 모든 키를 얻으려고했다. 나는 정말로 자동 증가 된 키가 필요했고,'LAST_INSERT_ID(); + 1' 나는 완전히 신뢰하지 않았으며, 이것은 어떤 식 으로든 안전해야합니다! – Yeti

+2

저는 2 년 늦었지만 감사합니다 :) D – Rorchackh

+1

고마워요, 이것이 유일한 방법이었습니다! :) – Nick