簡體   English   中英

在批處理模式下從MySQL檢索多行的auto_increment值

[英]Retrieve auto_increment value of multiple rows from MySQL in batch mode

有一個主鍵為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).

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM