2010-11-28 126 views
3

我正在使用Xerial最新的jdbc驅動程序for sqlite(版本3.7.2)它似乎沒有支持Statement RETURN_GENERATED_KEYS。我一直在SQLException中「未通過SQLite JDBC驅動程序實現」。Sqlite JDBC驅動程序不支持RETURN_GENERATED_KEYS

我真的不想做另一個選擇呼叫(例如,從任務順序中選擇id desc limit 1),以獲得由自動增量字段創建的最新Id。我需要使用該ID來填充另一個表中的字段。

有沒有更好的方法來實現這個使用sqlite-jdbc驅動程序?

+0

如果驅動程序不支持它,您需要一個新的驅動程序,另一個數據庫或自己編寫SELECT。無法保證您提供的示例查詢將適用於多位併發用戶。 – duffymo 2010-11-28 18:41:26

回答

8

如果升級/更換JDBC驅動程序不是一個選項(SQLiteJDBC似乎支持它),那麼您確實需要觸發SELECT last_insert_rowid()查詢來獲取生成的密鑰。爲了避免併發插入競爭條件,在事務中激發它。

connection = database.getConnection(); 
connection.setAutoCommit(false); // Starts transaction. 
preparedStatement = connection.prepareStatement(INSERT_SQL); 
preparedStatement.setSomething(something); 
// ... 
preparedStatement.executeUpdate(); 
statement = connection.createStatement(); 
generatedKeys = statement.executeQuery("SELECT last_insert_rowid()"); 
if (generatedKeys.next()) { 
    generatedKey = generatedKeys.getLong(1); 
} 
connection.commit(); // Commits transaction. 
+0

您提到的SQLiteJDBC驅動程序是我嘗試的第一個。有人建議使用Xerial。無論哪種情況,我都得到了「不支持」。我在MAC上運行JDBC – Amit 2010-11-29 02:52:05

3

我也使用SQLite-JDBC-3.7.2.jar和發現,使用不RETURN_GENERATED_KEYS失敗,但是僅僅做隨後的結果集=的Statement.getGeneratedKeys()的一個的Statement.execute(SQL); meta = resultset.getMetaData()顯示結果集中有一個列名'last_insert_rowid()'。因此,resultset.getInt(「last_insert_rowid()」)的確會返回新插入的rowid而無需額外的選擇。

相關問題