MYSQL 자체 증가 키 획득 [4 가지 방법]

15350 단어 mysql
다음으로 이동:http://blog.csdn.net/ultrani/article/details/9351573
작 가 는 이미 매우 잘 썼 다. 나 는 쓸데없는 말 을 하지 않 고 소장 품 을 직접 전재 했다.
일반적으로 우 리 는 응용 프로그램 에서 my sql 에 대해 insert 작업 을 실행 한 후에 기록 을 삽입 하 는 홈 키 를 가 져 와 야 합 니 다.본 고 는 자바 환경 에서 의 4 가지 방법 으로 insert 를 획득 한 기록 메 인 키 auto 를 소개 합 니 다.increment 의 값:
  • JDBC 2.0 을 통 해 제공 되 는 insertRow () 방식
  • JDBC 3.0 을 통 해 제공 되 는 getGenerated Keys () 방식
  • SQL select 를 통한 LASTINSERT_ID () 함수
  • SQL @ @ IDENTITY 변 수 를 통 해
  • 1. JDBC 2.0 을 통 해 제공 되 는 insertRow () 방식
    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

    좋은 웹페이지 즐겨찾기