Java에서 sqlite를 사용하여 마지막으로 삽입 한 ID를 얻는 가장 좋은 방법은 무엇입니까? 구글은 나에게 다른 대답을하고있다 - 어떤 것은 마지막 insert-rowid를 선택한다고 말한다; 다른 사람들은 statement.getGeneratedKeys()를 호출한다고 말합니다. 가장 좋은 경로는 무엇입니까? (그냥 ID를 반환하고 다른 삽입이나 다른 용도로 사용하지 마십시오.)Java에서 sqlite를 사용하여 마지막으로 삽입 한 ID를 얻는 가장 좋은 방법은 무엇입니까?
12
A
답변
9
JDBC 드라이버가 지원하는 경우 getGeneratedKeys()를 사용하십시오. 삽입 후에 키를 가져 오려고 노력하는 것을 원하지 않습니다. 드라이버가 getGeneratedKeys()를 지원하지 않으면 삽입 전에 키에서 다음 값을 가져옵니다.
20
두 접근법 모두 똑같은 SQL 문을 실행하지만 java.sql.Statement.getGeneratedKeys()
은 다른 기본 데이터베이스에 더 이식성이 있습니다.
sqlite3_last_insert_rowid()
C API 함수 또는 last_insert_rowid()
SQL 함수를 사용하면 마지막 삽입시 생성 된 ROWID를 검색하는 올바른 방법입니다. 직접 C API에 액세스 할 수없는 경우가 SELECT
문을 통해 스칼라 함수 last_insert_rowid()
를 호출 할 수 있습니다, 따라서
SELECT function-name();
:
SQLite는은으로 SQL scalar function 구문을 지원합니다.
당신이 SQLiteJDBC 구현을위한 source code 보면은 (당신이 사용중인이 있나요?)이 그 JDBC 래퍼의 저자가 수행 한 정확히 무엇이라고 표시됩니다
ResultSet getGeneratedKeys() throws SQLException {
if (getGeneratedKeys == null) getGeneratedKeys = conn.prepareStatement(
"select last_insert_rowid();");
return getGeneratedKeys.executeQuery();
}
어떤 방법으로 삽입 후 가장 큰 값보다 "더 나은"삽입 전의 키의 다음 값 "입니까? 둘 다 동일한 유형의 경쟁 조건을 가지며 둘 다 단조롭고 단일 증분 키를 사용합니다. –
삽입 이전에 검색된 키는 대상 테이블의 쿼리가 아닌 일부 키 공급자를 기반으로한다는 가정이 있습니다. 오라클 용어로는 select sequence_name.nextval from dual이 될 것입니다. SQL lite에 대한 세부 사항은 모르지만 삽입과 완전히 독립적 인 자율 트랜잭션에서 키를 반환하는 API 호출입니다. 그 말은 ... getGeneratedKeys()를 사용하십시오. –
행 = stmt.getGeneratedKeys(). getInt (1); –