자바 표 기록 삽입 후 증가 하 는 id (회전) (3 가지 방법 코드 첨부)
http://www.sthelse.com/2010/07/java-to-insert-in-the-main-table-record-id-from-the-table-for-the-main-table-as-a-foreign-key.html#comment-2264
MySQL 에서 auto 사용 하기increment 형식의 id 필드 는 표 의 메 인 키 로 하고 다른 표 의 외 키 로 사용 하여 '메 인 테이블 구조' 를 형성 합 니 다. 이것 은 데이터베이스 디자인 에서 흔히 볼 수 있 는 용법 입 니 다.그러나 구체 적 으로 id 를 생 성 할 때 우리 의 작업 순 서 는 보통 주 표 에 기록 을 삽입 한 다음 에 자동 으로 생 성 된 id 를 얻 고 이 를 바탕 으로 표 의 기록 을 삽입 하 는 것 입 니 다.
이 안에 어려움 이 있 습 니 다. 메 인 시트 기록 을 삽입 한 후에 해당 하 는 id 를 어떻게 얻 는 지 하 는 것 입 니 다.일반적인 방법 은 "select max (id) from tablename" 을 통 해 이 루어 집 니 다. 그러나 이러한 방법 은 병행 하 는 상황 을 고려 해 야 합 니 다. 업무 중 에 메 인 시트 에 "X 자물쇠" 를 넣 고 max (id) 의 값 을 얻 은 후에 잠 금 을 풀 어야 합 니 다. 이런 방법 은 절차 가 비교적 많 고 번 거 로 우 며 동시성 도 좋 지 않 습 니 다. 더 간단 한 방법 이 있 습 니까?
정 답 중 하 나 는 select LAST INSERT ID () 를 통 해 작 동 합 니 다. 언뜻 보기 에는 select max (id) 와 비슷 하지만 실제로는 스 레 드 가 안전 합 니 다. 즉, 데이터베이스 에 구체 적 으로 연 결 된 것 입 니 다. 다음은 실험 을 통 해 설명 합 니 다.
1. 연결 1 에 A 표 에 기록 을 삽입 하고 A 표 는 auto increment 형식의 필드 를 포함 합 니 다.
2. 연결 2 에서 A 표 에 기록 을 하나 더 삽입 합 니 다.
3. 결과: 연결 1 에서 select LAST INSERT ID () 를 실행 한 결과 와 연결 2 에서 select LAST INSERT ID () 를 실행 한 결 과 는 다 르 며, 두 연결 에서 select max (id) 를 실행 한 결 과 는 같 습 니 다. 사실 MSSQL 에서 SCOPE IDENTITY () 와 IDENT CURRENT () 의 차 이 는 여기 와 유사 합 니 다. SCOPE IDENTITY () 를 사용 합 니 다.IDENTITY 필드 에 삽 입 된 현재 세 션 의 값 을 얻 을 수 있 으 며, IDENT CURRENT () 를 사용 하면 세 션 을 구분 하지 않 고 특정한 IDENTITY 필드 에 삽 입 된 최대 값 을 얻 을 수 있 습 니 다.
주: select last insert id () 를 사용 할 때 주의해 야 합 니 다. 한 번 에 여러 개의 기록 을 삽입 할 때 첫 번 째 삽 입 된 id 값 만 얻 을 수 있 으 니 주의 하 십시오!
물론 JDBC 에 추가 기록 을 한 후 API 를 사용 하여 새로운 추가 기록 의 메 인 키 값 을 얻 는 또 다른 편리 한 방법 도 사용 할 수 있다.
이 는 Statement 의 getGenerated Keys 방법 을 사 용 했 습 니 다. Statement 이 기록 을 추가 하면 getGenerated Keys 방법 으로 새로운 추가 기록 을 얻 을 수 있 는 key 를 직접 호출 할 수 있 습 니 다.
테스트 프로그램 은 다음 과 같 습 니 다.
Java
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class GetGenerateKey {
public static void main(String[] args) throws Exception {
create();
}
public static void create()throws Exception {
System.setProperty("jdbc.drivers", "com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc", "root", "");
Statement st = conn.createStatement();
String sql = "insert into user (name, birthday, money) values ('beck', '1949-10-01', 60)";
st.executeUpdate(sql, Statement.RETURN_GENERATED_KEYS);
ResultSet rs = st.getGeneratedKeys();
if (rs.next()) {
int id = rs.getInt(1);
System.out.println (" key :" + id);
}
st.close();
conn.close();
}
}
프로그램 실행 결과: 기록 생 성 키: 9
데이터베이스 기록:
1
+----+----------+------------+-------+
2
| id | name | birthday | money |
3
+----+----------+------------+-------+
4
| 9 | beck | 1949-10-01 | 60 |
5
+----+----------+------------+-------+
요약: 이 API 방법 은 새로운 기록 을 얻 을 수 있 는 key 값 을 다시 실행 하지 않 아 도 된다 는 장점 을 제공 합 니 다. 작업량 과 서버 의 부담 을 줄 였 습 니 다.
주의 하 세 요. execute Update 방법 을 실행 할 때 키 생 성 을 되 돌려 주 는 옵션 을 지정 해 야 합 니 다.
===========================================================
2 가지 방법의 자바 코드
Java
// id
PreparedStatement pstmt = conn.prepareStatement(sql.toString(),PreparedStatement.RETURN_GENERATED_KEYS);
for (int i = 0; i < pars.length; i++) {
pstmt.setObject(i+1, pars[i]);
}
pstmt.executeUpdate();
long autoIncKeyFromApi = -1;
ResultSet rs = pstmt.getGeneratedKeys();
if (rs.next()) {
autoIncKeyFromApi = rs.getInt(1);
}
return autoIncKeyFromApi;
Java
qRunner.update(conn,sql.toString(),pars);
Long zsysqID = (Long) qRunner.query(conn, "SELECT LAST_INSERT_ID()", new ScalarHandler(1));
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.