2009-11-09 4 views
1

레코드를 저장하는 데이터베이스 테이블 A가 있습니다. A는 auto_increment가있는 기본 키 (recordid)가 있습니다. A에 레코드를 삽입 할 때마다 삽입 된 레코드 ID를 얻고 다른 masterTable에 저장합니다. 나는 즉시 SELECT 문을 사용하고Java에서 데이터베이스 테이블의 마지막으로 삽입 된 레코드 ID 가져 오기?

내가이 같은 recordId를 얻을 수있는에 삽입을 수행

recordId를 DESC의 LIMIT 1에 의한 순서와

선택의 recordId;

는하지만 난 두 개의 레코드에 같은 시간에 (다른 스레드에 의해) 삽입 된 문제가 오늘로 달리고 난 마스터 ID를 잘못 recordId를합니다 (txns 모두 동일 recordId를)

를 저장 결국

Statement.getGeneratedKeys()에 대해 들었습니다. 문제 해결에 도움이되는지 알고 싶습니다. 또는 이것을 처리하는 가장 좋은 방법은 무엇입니까?

답변

8

getGeneratedKeys 메서드를 사용할 수 있습니다. 이 forum post 도움이 될 것입니다.

Hibernate과 같은 ORM 도구를 사용하는 것이 좋습니다. 최대 절전 모드에서 당신은 같은 것을 할 것입니다 :

myTable = new myTable(); 
myTable.prop1 = prop1; 
myTable.prop2 = prop2; 
int id = session.save(myTable); 

Hibernate는 (선택한 데이터베이스에 따라) 적절한 SQL 명령을 실행하고 당신에게 자동 생성 된 ID를 반환합니다.

+0

MySQL JDBC 드라이버가 구현하는 경우. –

+0

사실입니다. JDBC 드라이버가 지원하지 않으면 ID를 가져 오기 위해 데이터베이스 고유의 메소드에 의존해야합니다. – kgiannakakis

+0

@kgiannakakis -'session.save (myTable)'은'int'를 반환하지 않습니다. 다만, java.io.serializable를 돌려 주어, getGeneratedKeys() 메소드는 지금까지 JDBC 드라이버의 구현에서는 지원되어 있지 않습니다. 따라서 언급 한 두 가지 사례 중 어느 것도 명백한 것으로는 성공적이지 않습니다. 그들은 정말로 일하니? – Lion

3

MySQL JDBC 드라이버는 getGeneratedKey() 메소드를 지원합니다.

우리가 지금 당신이 AUTO_INCREMENT 키를 검색해야하는 경우에 사용하는 기본 방법입니다 새로운 JDBC 3.0 방법 getGeneratedKeys()의 사용을 보여줍니다 MySQL의 설명서의 섹션 20.3.5.1.4. Retrieving AUTO_INCREMENT Column Values에서보세요.

1

generatedKeys를 지원하지 않는 데이터베이스에서는 반환 매개 변수로 ID를 가져올 수 있습니다. 예를 들어 오라클은 xxx INTO를 반환합니까? 구문 여기서 xxx는 열 이름입니다.

관련 문제