2012-01-15 62 views
6

Tôi đang chơi với JDBC/MySQL 5.1. Tôi đã tạo một truy vấn insert để chèn một số dữ liệu vào một bảng và muốn trả lại khóa đã tạo từ hàng mới được tạo. Tuy nhiên, khi tôi tham khảo cột bằng "id", đó là cột PK và cột tăng tự động của tôi.Tại sao getGeneratedKeys() trả lại "GENERATED_KEY" làm tên cột?

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 
    // ... 
} 

Vì vậy, câu hỏi của tôi: Tại sao ResultSet.getGeneratedKeys sử dụng GENERATED_KEY như tên cột?

Trả lời

3

Bạn không nên truy xuất các cột này theo tên. Chỉ theo chỉ mục, kể từ chỉ có thể có một cột với MySQL và auto_increments rằng trả về (các) giá trị có thể được hiển thị bởi Statement.getGeneratedKeys().

Hiện nay máy chủ MySQL không trả lại thông tin trực tiếp mà sẽ làm cho khả năng lấy các cột này theo tên một cách hiệu quả có thể, đó là lý do tại sao tôi đang đánh dấu này là "được cố định sau", kể từ khi chúng tôi có thể, một khi máy chủ trả về thông tin trong một cách mà người lái xe có thể sử dụng.

Từ here (năm 2006!).

Các vấn đề liên quan