java - 我如何知道使用 JDBC 为批量更新创建了哪些自动增量值?

标签 java sql sqlite jdbc

我认为这个问题总结得很好,这是我目前的代码,但它没有给我所需的结果。我想返回一个 int 数组,其中包含为该批处理中创建的每一行生成的自动增量 id。

CREATE_APPOINTMENT = database.prepareStatement("INSERT INTO " + TABLE_APPOINTMENTS + " VALUES (?, ?, ?, ?, ?)");

   public static int[] createAppointment(Appointment... appointments) {
    int[] ids = new int[appointments.length];
    int count = 0;
    try {
        for (Appointment a : appointments) {
            CREATE_APPOINTMENT.setDate(2, a.date);
            CREATE_APPOINTMENT.setTime(3, a.time);
            CREATE_APPOINTMENT.setInt(4, a.duration);
            CREATE_APPOINTMENT.setString(5, a.clientName);
            CREATE_APPOINTMENT.addBatch();
        }
        CREATE_APPOINTMENT.executeBatch();

        ResultSet resultSet = CREATE_APPOINTMENT.getGeneratedKeys();
        if (resultSet != null)
            while (resultSet.next()) {
                ids[count++] = resultSet.getInt(1);
            }

    } catch (SQLException ex) {
        System.err.println(ex);
    }
    return ids;
}

我尝试创建 8 个约会,并且根据数据库成功创建了它们的 id,但我的返回数组仅包含最后一个 id,其余均为 0。我哪里遗漏了什么?

最佳答案

事实上这是不可能的。 stmt.getGenerateKeys() 将始终仅返回一个值,因为 sqlite-jdbc 驱动程序中的此方法是这样实现的:


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

您的数组使用零值进行初始化,然后将最后生成的 id 分配给数组的第一个元素。

关于java - 我如何知道使用 JDBC 为批量更新创建了哪些自动增量值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13122434/

相关文章:

java - driver.getcurrenturl() 没有获取正确的url

mysql - 类似excel的SQL多排序数据库

sqlite 到 coredata

java - 如何使用正则表达式根据模式拆分字符串

java - Android - 使用另一个类的变量?

SQL关系和查询

sql - 如何优化 SQLite ORDER BY rowid?

sqlite - 删除sqlite中某个日期的记录?

ios - NSMutableDictionary 给出所有相同的值而不是新的新值

java - 在 java 中加载 mp3 文件时面临的问题无法从输入文件中获取音频输入流