2011-02-10 34 views
12

Sử dụng Trình kết nối/J, tôi muốn chèn hàng loạt vào bảng chính, sau đó chèn hàng loạt vào bảng chi tiết (PreparedStatement.executeBatch() cho cả hai). Tôi không tìm thấy nhiều thông tin trực tuyến, vì vậy tôi đang tìm kiếm bất kỳ phản hồi nào từ những người có kinh nghiệm về vấn đề này.Sử dụng getGeneratedKeys với chèn hàng loạt trong MySQL với Connector/J

  1. Tôi có thể sử dụng Statement.getGeneratedKeys() để có được các ID của các hàng mới được chèn trong bảng tổng thể để tôi có thể sử dụng chúng như phím nước ngoài trong chèn chi tiết?

  2. Điều gì xảy ra nếu không phải mọi truy vấn đều dẫn đến kết quả là một lần chèn (ví dụ: có truy vấn insert ignore hoặc insert ... on duplicate key update)? Tôi có nhận được hàng trong Statement.getGeneratedKeys() cho mọi tuyên bố hoặc chỉ cho những câu mới?

  3. Điều gì sẽ Statement.getGeneratedKeys() trở có lỗi với một trong những hồ sơ tổng thể chèn, và continueBatchOnError được thiết lập để true trong chuỗi kết nối?

  4. Có sự khác biệt nào về hành vi liên quan giữa Trình kết nối/phiên bản J 5.0.x so với 5.5.x không? Còn MySQL 5.0 và 5.1 thì sao?

  5. Bất kỳ vấn đề hoặc gotchas nào khác mà tôi cần phải biết?

  6. Có cách nào tốt hơn để thực hiện việc này không?

Trả lời

12

Vâng, tôi đã chạy một số thử nghiệm. Với Connector/J 5.1 và MySQL 5.1.42, tôi quan sát như sau:

  1. Statement.getGeneratedKeys() công trình như mong đợi cho chèn

  2. Nếu một hàng được chèn hoặc cập nhật (update mảng đếm được trả về bởi executeBatch() lợi nhuận '1' hoặc '2'), Statement.getGeneratedKeys() sẽ có khóa cho hàng đó. Nếu hàng không được sửa đổi (insert ignore hoặc insert ... on duplicate key update dẫn đến số không, số executeBatch() trả về 3), không có khóa.

  3. ResultSet được trả về bởi getGeneratedKeys sẽ có các mục nhập cho các hàng được chèn thành công, theo (2). Sẽ không có hàng khóa được tạo cho chèn không thành công (trong đó giá trị đếm cập nhật là Statement.EXECUTE_FAILED)

  4. ?

  5. Hãy cẩn thận với rewriteBatchedStatements trong chuỗi kết nối JDBC. Nếu nó được đặt thành true, bất kỳ lỗi nào sẽ dẫn đến mọi hàng trong "đoạn văn" được ghi lại để được xử lý như thể nó không thành công. Một cách để xử lý việc này là lặp lại các hàng không thành công và thử lại chúng mà không cần thực hiện theo đợt.

  6. ?

+0

Lưu ý có một số ràng buộc trên bảng - http://stackoverflow.com/q/7333524/1339987 – djechlin

Các vấn đề liên quan