2015-08-25 3 views
1

Существует MySQL таблица с первичным ключом, как id int auto_increment, мне нужно вставить несколько строк в пакете с несколькими insert заявлением, с autocommit инвалидами, следующим образом:Получить значение auto_increment нескольких строк из MySQL в пакетном режиме

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; 

Возможно ли получить каждый сгенерированный идентификатор, а не только последний идентификатор.

Если да, то когда был создан каждый идентификатор и как получить все идентификаторы через jdbc?

Thx.

ответ

6

Если вы хотите получить ключи AUTO_INCREMENT через JDBC вы должны использовать 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). 
+0

Весьма хороший пример, +1 для включения создания таблицы, чтобы перейти с примером запроса. –