MYSQL 자체 증가 키 획득 [4 가지 방법]
15350 단어 mysql
작 가 는 이미 매우 잘 썼 다. 나 는 쓸데없는 말 을 하지 않 고 소장 품 을 직접 전재 했다.
일반적으로 우 리 는 응용 프로그램 에서 my sql 에 대해 insert 작업 을 실행 한 후에 기록 을 삽입 하 는 홈 키 를 가 져 와 야 합 니 다.본 고 는 자바 환경 에서 의 4 가지 방법 으로 insert 를 획득 한 기록 메 인 키 auto 를 소개 합 니 다.increment 의 값:
jdbc 2.0 이후 아래 방식 으로 실행 할 수 있 습 니 다.
Statement stmt = null;
ResultSet rs = null;
try {
stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY, // Statement
java.sql.ResultSet.CONCUR_UPDATABLE);
stmt.executeUpdate("DROP TABLE IF EXISTS autoIncTutorial");
stmt.executeUpdate( // demo
"CREATE TABLE autoIncTutorial ("
+ "priKey INT NOT NULL AUTO_INCREMENT, "
+ "dataField VARCHAR(64), PRIMARY KEY (priKey))");
rs = stmt.executeQuery("SELECT priKey, dataField " //
+ "FROM autoIncTutorial");
rs.moveToInsertRow(); // ( )
rs.updateString("dataField", "AUTO INCREMENT here?"); //
rs.insertRow(); //
rs.last(); //
int autoIncKeyFromRS = rs.getInt("priKey"); // preKey
rs.close();
rs = null;
System.out.println("Key returned for inserted row: "
+ autoIncKeyFromRS);
} finally {
// rs,stmt close()
}
장점: 초기 에 비교적 통용 되 는 방법
단점: ResultSet 의 커서 를 조작 해 야 합 니 다. 코드 가 지루 합 니 다.
2. JDBC 3.0 을 통 해 제공 되 는 getGenerated Keys () 방식
Statement stmt = null;
ResultSet rs = null;
try {
stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,
java.sql.ResultSet.CONCUR_UPDATABLE);
// ...
// ( demo )
// ...
stmt.executeUpdate(
"INSERT INTO autoIncTutorial (dataField) "
+ "values ('Can I Get the Auto Increment Field?')",
Statement.RETURN_GENERATED_KEYS); // generatedKeys!
int autoIncKeyFromApi = -1;
rs = stmt.getGeneratedKeys(); // !
if (rs.next()) {
autoIncKeyFromApi = rs.getInt(1);
} else {
// throw an exception from here
}
rs.close();
rs = null;
System.out.println("Key returned from getGeneratedKeys():"
+ autoIncKeyFromApi);
} finally { ... }
이런 방식 은 두 단계 만 필요 하 다.
1. execute Update 시 키 자동 가 져 오기 활성화;
2. Statement 의 getGenerated Keys () 인터페이스 호출
장점:
1. 조작 이 편리 하고 코드 가 간결 하 다
2. jdbc 3.0 의 기준
3. 효율 이 높 습 니 다. 데이터 베 이 스 를 추가 로 방문 하지 않 았 기 때 문 입 니 다.
여기 보충 해 주세요.
a. jdbc 3.0 이전에 모든 jdbc driver 의 실현 은 자신 이 홈 키 를 추가 하 는 인 터 페 이 스 를 가 져 옵 니 다.my sql jdbc 2.0 driver org. gjt. mm. mysql 에서 getGenerated Keys () 함 수 는 org. gjt. mm. mysql. jdbc 2. Staement. getGenerated Keys () 에서 실 현 됩 니 다.이렇게 직접 인용 하면 이식 성에 큰 영향 을 미 칠 수 있다.JDBC 3.0 은 표준 getGenerated Keys 를 통 해 이 점 을 잘 보완 했다.
b. getGenerated Keys () 에 대해 홈 페이지 에 더 자세 한 설명 이 있 습 니 다. OracleJdbcGuide
3. SQL select 를 통한 LASTINSERT_ID()
Statement stmt = null;
ResultSet rs = null;
try {
stmt = conn.createStatement();
// ...
//
// ...
stmt.executeUpdate(
"INSERT INTO autoIncTutorial (dataField) "
+ "values ('Can I Get the Auto Increment Field?')");
int autoIncKeyFromFunc = -1;
rs = stmt.executeQuery("SELECT LAST_INSERT_ID()"); // generatedKey
if (rs.next()) {
autoIncKeyFromFunc = rs.getInt(1);
} else {
// throw an exception from here
}
rs.close();
System.out.println("Key returned from " +
"'SELECT LAST_INSERT_ID()': " +
autoIncKeyFromFunc);
} finally {...}
이런 방식 은 말 할 것 도 없 이 함수 LAST 를 한 번 더 조회 하 는 것 이다.INSERT_ID().
장점: 간단 하고 편리 함
단점: JDBC 3.0 의 getGenerated Keys () 에 비해 데이터베이스 조회 가 한 번 더 필요 합 니 다.
보충:
1. 이 함 수 는 mysql 5.5 매 뉴 얼 에서 "returns a BIGINT (64 - bit) value representing the first automation generated value successfully inserted for an AUTO INCREMENT column as a result of the most recently executed INSERT statement." 라 고 정의 합 니 다.문서 점
2. 이 함 수 는 connection 차원 에서 '라인 이 안전 합 니 다' 입 니 다.즉, my sql 연결 마다 LAST 를 독립 적 으로 저장 합 니 다.INSERT_ID () 의 결과, 그리고
현재 연결 의 최근 insert 작업 에 만 업 데 이 트 됩 니 다.즉, 2 개의 연결 이 insert 문 구 를 동시에 실행 할 때 각각 호출 되 는 LASTINSERT_ID () 는 서로 덮어 쓰 지 않 습 니 다.밤 들 기: A 를 시계 에 연결 한 후 LASTINSERT_ID () 100 을 되 돌려 주 고 B 를 연결 하여 테이블 에 삽입 한 후 LASTINSERT_ID () 는 101 로 되 돌아 가지 만 A 를 연결 하여 LAST 를 반복 합 니 다.INSERT_ID () 때 는 101 이 아 닌 100 으로 되 돌아 갑 니 다.이것 은 my sql 연결 수 와 실행 결 과 를 모니터링 하여 검증 할 수 있 으 며, 여기 서 실험 과정 을 상세 하 게 설명 하지 않 습 니 다.
3. 위의 그 점 을 바탕 으로 같은 연결 을 전제 로 insert 를 동시에 실행 하면 2 차 작업 의 반환 값 이 서로 겹 칠 수 있 습 니 다.LAST 때문에INSERT_ID () 의 격 리 정 도 는 연결 단계 입 니 다.이 점 은 getGenerated Keys () 가 더 잘 할 수 있 습 니 다. getGenerated Keys () 는 statement 급 이기 때 문 입 니 다.같은 connection 의 여러 번 statement, getGenerated Keys () 는 서로 덮어 쓰 지 않 습 니 다.
4. SQL SELECT @ @ IDENTITY 를 통 해
이 방식
LAST_INSERT_ID () 효 과 는 같 습 니 다.홈 페이지 문 서 는 이렇게 설명 합 니 다. "이 변 수 는 last insert id 변수의 동의어 입 니 다. 다른 데이터베이스 시스템 과 의 호환성 을 위해 존재 합 니 다. SELECT @ @ identity 로 값 을 읽 고 SET identity 를 사용 하여 설정 할 수 있 습 니 다." 문서 점
중요 한 보충:
SELECT LASTINSERT_ID () 또는 SELECT @ @ IDENTITY 입 니 다. 하나의 insert 문장 에 여러 개의 기록 을 삽입 하면 첫 번 째 기록 을 삽입 한 generatedKey 만 영원히 되 돌려 줍 니 다. 예 를 들 어:
INSERT INTO t VALUES
-> (NULL, 'Mary'), (NULL, 'Jane'), (NULL, 'Lisa');
LAST_INSERT_ID (), @ IDENTITY 는 'Mary' 가 있 는 그 기록 의 generatedKey 만 되 돌려 줍 니 다.
작은 매듭
따라서 JDBC 3 가 제공 하 는 getGenerated Keys () 함 수 를 통 해 insert 기록 의 메 인 키 를 가 져 오 는 것 이 좋 습 니 다.간단 할 뿐만 아니 라 효율 도 높다.
my batis 에 관련 설정 이 있 습 니 다:
<insert id="save" parameterType="MappedObject" useGeneratedKeys="true" keyProperty="id">
</insert>
mybatis 문서 참조: sqlmap-xml
참고 자료
http://dev.mysql.com/doc/connector-j/en/connector-j-usagenotes-last-insert-id.html
http://www.onjava.com/pub/a/onjava/excerpt/javaentnut_2/index2.html?page=3
http://docs.oracle.com/javase/1.4.2/docs/guide/jdbc/getstart/statement.html#1000569
http://dev.mysql.com/doc/refman/5.5/en/information-functions.html#function_last-insert-id
http://nic.jlu.edu.cn/newcourse/dbxz/jdbc20.pdf
http://www.enidc.com/help/newscontent/110507
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
MySQL에서 JSON 인덱싱 - aarondfrancis사람들은 종종 MySQL로 JSON을 인덱싱할 수 없다고 말하지만 완전히 정확하지는 않습니다. MySQL로 JSON 열을 인덱싱하는 것은 완전히 가능합니다! 사람들은 종종 MySQL로 JSON을 인덱싱할 수 없다고 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.