2008-10-19 23 views

回答

9

如果您的JDBC驅動程序支持它,請使用getGeneratedKeys()。在插入之後,你不想試圖讓自己得到鑰匙。如果您的驅動程序不支持getGeneratedKeys(),那麼在插入之前,我會從鍵中獲取下一個值。

+0

以何種方式是「插入前鍵的下一個值」比「插入後的最大值」更好嗎?兩者都具有相同類型的競爭條件,並且都依賴於單調遞增的密鑰。 – 2013-03-19 14:54:43

20

任一方法都執行相同的確切SQL語句,但java.sql.Statement.getGeneratedKeys()更容易移植到不同的底層數據庫。

使用sqlite3_last_insert_rowid() C API函數或last_insert_rowid() SQL函數是檢索上次插入過程中生成的rowid的正確方法。

SQLite支持的SQL scalar function語法爲:

SELECT function-name(); 

因此,如果您不能直接訪問該C API,你可以通過SELECT語句調用標量函數last_insert_rowid()

如果你看一下source codeSQLiteJDBC實現(這是你用什麼?)你會看到,這正是JDBC的包裝的作者做:

ResultSet getGeneratedKeys() throws SQLException { 
    if (getGeneratedKeys == null) getGeneratedKeys = conn.prepareStatement(
     "select last_insert_rowid();"); 
    return getGeneratedKeys.executeQuery(); 
} 
相關問題