Dưới đây là đoạn code mà hoạt động:Lấy id nối tiếp từ hàng loạt lắp vào postgresql
Connection c = ds.getConnection();
c.setAutoCommit(false);
PreparedStatement stmt = c.prepareStatement("INSERT INTO items (name, description) VALUES(?, ?)");
while (!(items = bus.take()).isEmpty()) {
for (Item item : items) {
stmt.setString(1, item.name);
stmt.setString(2, item.description);
stmt.addBatch();
}
stmt.executeBatch();
c.commit();
}
Nhưng bây giờ tôi cần phải cư khác bàn nơi id là khóa ngoại. Nếu tôi sử dụng INSERT với RETURNING id
thì executeBatch
không thành công với lỗi "Kết quả đã được trả về khi không ai được mong đợi".
tôi thấy một số cách để giải quyết việc này
- Do chèn cá nhân chứ không phải là chèn hàng loạt.
- Thay thế id nối tiếp bằng guid được tạo bởi khách hàng.
- Sử dụng một số loại thủ tục được lưu trữ để thực hiện chèn hàng loạt và trả về danh sách các id.
Trong ba phương pháp mà tôi thấy cái cuối cùng dường như bảo toàn cả hiệu quả chèn hàng loạt và trả lại id, nhưng nó cũng phức tạp nhất đối với tôi vì tôi chưa bao giờ viết thủ tục lưu trữ.
Có cách nào tốt hơn để chèn hàng loạt và nhận ID không? Tôi không có vấn đề bằng cách sử dụng API cụ thể postgresql thay vì jdbc.
Nếu không, bất kỳ ai có thể phác thảo quy trình được lưu trữ này không?
Dưới đây là lược đồ bảng:
CREATE UNLOGGED TABLE items
(
id serial,
name character varying(1000),
description character varying(10000)
)
WITH (
OIDS=FALSE
);
Hãy xem phương pháp JDBC 'getGeneratedKeys'. Tôi đã không xác minh cụ thể nó cho các kết nối hàng loạt, mặc dù. –
Làm thế nào về populating cả hai bảng cùng một lúc với wCTE? –
@JakubKania - wCTE là gì? Bạn có thể cho thấy một ví dụ? – mark