2012-01-15 19 views
6

我正在玩JDBC/MySQL 5.1。我創建了一個insert查詢來將一些數據插入到表中,並希望從新創建的行中返回生成的密鑰。但是,當我通過「id」(這是我的PK和自動增量列)引用列時。getGeneratedKeys()爲什麼返回「GENERATED_KEY」作爲列名?

PreparedStatement ps = St0rm.getInstance().getDatabase("main") 
     .prepare("INSERT INTO quests (name,minlevel,start_npc,end_npc) VALUES(?,?,?,?)", true); // creates a prepared statement with flag RETURN_GENERATED_KEYS 

// ... 

int affected = ps.executeUpdate(); 
ResultSet keys = ps.getGeneratedKeys(); 
if (affected > 0 && keys.next()) { 
    St0rm.getInstance().getLogger().warning(String.format("ID Column Name: %s", keys.getMetaData().getColumnName(1))); // says the column name is: GENERATED_KEY 

    q = new Quest(keys.getInt(1)); // column index from the generated key, no error thrown. 

    q = new Quest(keys.getInt("id")); // actual column name, line throws a SQLException 
    // ... 
} 

所以,我的問題:爲什麼ResultSet.getGeneratedKeys使用GENERATED_KEY作爲列名?

回答

3

您不應該按名稱檢索這些列。由於 只有索引,因此只能有一列使用MySQL和auto_increments, 返回可由Statement.getGeneratedKeys()公開的值。

目前,MySQL服務器不返回的信息直接在 將使名字在 有效的方式成爲可能,這是檢索這些列的能力,我爲什麼我這個標記爲「是 後來固定的」,因爲我們可以,一旦服務器以 的方式返回驅動程序可以使用的信息。

here(在2006!)。

相關問題