java - 以批处理模式从 MySQL 中检索多行的 auto_increment 值

标签 java mysql jdbc auto-increment autocommit

有一个主键为id int auto_increment的mysql表, 我需要使用多个 insert 语句批量插入多行,并禁用 autocommit,如下所示:

SET autocommit=0;
INSERT INTO dummy(NAME, `size`, create_date) VALUES('test', 1, NOW());
INSERT INTO dummy(NAME, `size`, create_date) VALUES('test', 2, NOW());
COMMIT;

是否可以获取每个生成的 ID,而不仅仅是最后一个 ID。

如果有,每个id是什么时候生成的,如何通过jdbc获取所有id?

谢谢。

最佳答案

如果您想通过 JDBC 检索 AUTO_INCREMENT 键,您需要使用 JDBC 功能(RETURN_GENERATED_KEYS.getGeneratedKeys()),如下所示:

try (Connection conn = DriverManager.getConnection(myConnectionString, "root", "beer")) {
    try (Statement st = conn.createStatement()) {
        st.execute(
                "CREATE TEMPORARY TABLE dummy (" +
                    "`id` INT AUTO_INCREMENT PRIMARY KEY, " +
                    "`NAME` VARCHAR(50), " +
                    "`size` INT, " +
                    "`create_date` DATETIME " +
                ")");
    }
    conn.setAutoCommit(false);
    System.out.println("AutoCommit is OFF.");
    String sql = "INSERT INTO dummy(NAME, `size`, create_date) VALUES('test', ?, NOW())";
    try (PreparedStatement ps = conn.prepareStatement(
            sql, 
            PreparedStatement.RETURN_GENERATED_KEYS)) {
        // first batch
        ps.setInt(1, 1);  // `size` = 1
        ps.addBatch();
        ps.setInt(1, 2);  // `size` = 2
        ps.addBatch();
        ps.executeBatch();
        System.out.println("First batch executed. The following AUTO_INCREMENT values were created:");
        try (ResultSet rs = ps.getGeneratedKeys()) {
            while (rs.next()) {
                System.out.println(rs.getInt(1));
            }
        }
        try (Statement st = conn.createStatement()) {
            sql = "SELECT COUNT(*) AS n FROM dummy";
            try (ResultSet rs = st.executeQuery(sql)) {
                rs.next();
                System.out.println(String.format("The table contains %d row(s).", rs.getInt(1)));
            }
        }
        conn.rollback();
        System.out.print("Transaction rolled back. ");
        try (Statement st = conn.createStatement()) {
            sql = "SELECT COUNT(*) AS n FROM dummy";
            try (ResultSet rs = st.executeQuery(sql)) {
                rs.next();
                System.out.println(String.format("The table contains %d row(s).", rs.getInt(1)));
            }
        }
        // second batch
        ps.setInt(1, 97);  // `size` = 97
        ps.addBatch();
        ps.setInt(1, 98);  // `size` = 98
        ps.addBatch();
        ps.setInt(1, 99);  // `size` = 99
        ps.addBatch();
        ps.executeBatch();
        System.out.println("Second batch executed. The following AUTO_INCREMENT values were created:");
        try (ResultSet rs = ps.getGeneratedKeys()) {
            while (rs.next()) {
                System.out.println(rs.getInt(1));
            }
        }
    }
    try (Statement st = conn.createStatement()) {
        sql = "SELECT COUNT(*) AS n FROM dummy";
        try (ResultSet rs = st.executeQuery(sql)) {
            rs.next();
            System.out.println(String.format("The table contains %d row(s).", rs.getInt(1)));
        }
    }
}

...产生以下控制台输出:

AutoCommit is OFF.
First batch executed. The following AUTO_INCREMENT values were created:
1
2
The table contains 2 row(s).
Transaction rolled back. The table contains 0 row(s).
Second batch executed. The following AUTO_INCREMENT values were created:
3
4
5
The table contains 3 row(s).

关于java - 以批处理模式从 MySQL 中检索多行的 auto_increment 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32198480/

相关文章:

java - 查询和写入文件 : errorcode 28

java - 如何通过反射找出一个字段是否是一个类型的实例?

mysql - 在sql中显示超过3个月的记录

php - 获取过去 14 天的数据并与最近 7 天进行比较

mysql - 如何在不同服务器的MySQL库之间迁移数据?

java - 如何使用带日期的用户参数在 Java 中编写 MySQL 查询

java - 尝试使用 JDBC 连接到 Java Derby 数据库

java - 执行服务:How to put the lists returned by multiple callables in into a parent list?

java - 我们可以每次为 struts 1.x Action 类创建一个新实例吗?

java - 使用 java.net.URLConnection 获取 html 中的数据仅获取 html 代码而不是实际数据