Mysql getGeneratedKeys()是否应该在所有插入操作中返回值1到n?

Mysql getGeneratedKeys()是否应该在所有插入操作中返回值1到n?,mysql,jdbc,Mysql,Jdbc,假设您使用JDBCs getGeneratedKeys()方法编写了如下代码: 私有静态void writeToDB(字符串url[],字符串项目[]){ 试一试{ //更新主表 String sql=“插入主(url、项目)值(?,)”; PreparedStatement mainStmt=dbConn.prepareStatement(sql,Statement.RETURN\u生成的\u键); for(int i=0;i

假设您使用JDBCs getGeneratedKeys()方法编写了如下代码:

私有静态void writeToDB(字符串url[],字符串项目[]){
试一试{
//更新主表
String sql=“插入主(url、项目)值(?,)”;
PreparedStatement mainStmt=dbConn.prepareStatement(sql,Statement.RETURN\u生成的\u键);
for(int i=0;i
现在,在执行上述INSERT命令之前,数据库中有一组条目。 该表大致如下所示:

ID | url |项目 1| google.com|A
2 | bing.com | B

以ID作为主键并自动递增

对于上面的INSERT命令,我希望getGeneratedKeys()返回值3,4,…,n,但是我得到的是1,2,…,n

因为我想在其他表中将ID用作外键,所以getGeneratedKeys()不提供正确的值(acutal ID),但总是从1开始计数,尽管之前有数据库条目


如何获取实际创建的ID?我没有看到任何其他与此方法相关的线程报告有相同的问题。

插入后表是什么样子的?添加了正确递增的ID(3,4,…,n)和URL的新条目,并根据数组创建了项目。这个例子是我自己写的。我在上面的帖子中描述的“问题”实际上发生在一个包含500多行代码的程序中,一个包含大量表的数据库中,但我不想垃圾邮件发送大量不必要的代码。getGeneratedKeys()应该返回实际的ID值,还是该方法总是以一个ID值开头?它应该返回实际生成的键,对我来说也是如此。听起来好像出了什么问题。也许代码使用了行索引而不是值?我同意@EJP的观点,您的实际代码还有其他问题。我刚刚将您的示例代码粘贴到Eclipse中,在向已经包含两行的表添加了两行新行之后,我得到了
AutoGeneratedKey:4
,因此您的示例代码工作正常(至少在一定程度上,它返回循环执行的最后一次插入生成的ID).我截断了我的实际数据库,并用现在返回的正确密钥运行了几次代码。我猜错误在存储的数据中的某个地方。在接下来的几天里,我将继续关注问题的再次发生,并添加新的数据。如果问题还没有解决,我会考虑这个问题。感谢您检查代码和回复。(我将在未来几天编辑此帖子)
private static void writeToDB(String url[], String project[]){

    try{
        //Update main table
        String sql = "INSERT INTO main (url, project) VALUES(?,?)";
        PreparedStatement mainStmt = dbConn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
        for(int i = 0; i < url.length; i++){
            mainStmt.setString(1, url[i]);
            mainStmt.setString(2, project[i]);
            mainStmt.executeUpdate();
        }

        ResultSet projectId = mainStmt.getGeneratedKeys();
        projectId.next();
        int projectID = projectId.getInt(1);
        System.out.println("AutoGeneratedKey: " + projectID);

        mainStmt.close();
        projectId.close();
    }
    catch(SQLException e){
        e.printStackTrace();
    }

}