在購物車結算等場景中,往往需要將用戶選擇的多個商品一次性寫入訂單表。本文介紹SQL標準的批量插入語法,以及不同數據庫的優化方案。
多條INSERT語句以分號分隔,可在一次數據庫往返中執行:
INSERT INTO table1(c1,c2,c3) VALUES('1','1','1');
INSERT INTO table2(c1,c2,c3) VALUES('2','2','2');
INSERT INTO table3(c1,c2,c3) VALUES('3','3','3');
優點:簡單通用,所有主流數據庫(MySQL、SQL Server、Oracle、PostgreSQL)均支持。
缺點:超大批次可能超過查詢長度限制,需分批提交。
INSERT INTO order_items (order_id, product_id, quantity, price)
VALUES
(1001, 10, 2, 99.00),
(1001, 25, 1, 199.00),
(1001, 7, 3, 49.00);
單條語句插入多行,減少網絡交互,性能提升顯著。
-- SQL Server
INSERT INTO target_table (col1, col2)
SELECT 'a', 1 UNION ALL SELECT 'b', 2 UNION ALL SELECT 'c', 3;
String sql = "INSERT INTO order_items (order_id, product_id, qty) VALUES (?, ?, ?)";
try (PreparedStatement ps = conn.prepareStatement(sql)) {
for (CartItem item : cartItems) {
ps.setLong(1, orderId);
ps.setLong(2, item.getProductId());
ps.setInt(3, item.getQty());
ps.addBatch();
}
int[] results = ps.executeBatch(); // 一次性發送
conn.commit();
}
關鍵點:addBatch()累積參數,executeBatch()一次發送,需關閉自動提交(conn.setAutoCommit(false))。
BatchUpdateException可獲取每條語句的更新計數或錯誤詳情。