首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

SQL批量插入多條數據的高效寫法

     編輯:程式設計綜合問答

一條SQL語句實現多表、多行數據插入

在購物車結算等場景中,往往需要將用戶選擇的多個商品一次性寫入訂單表。本文介紹SQL標準的批量插入語法,以及不同數據庫的優化方案。

標準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)均支持。
缺點:超大批次可能超過查詢長度限制,需分批提交。

MySQL優化:VALUES多行語法

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 / PostgreSQL:使用CTE或UNION ALL

-- SQL Server
INSERT INTO target_table (col1, col2)
SELECT 'a', 1 UNION ALL SELECT 'b', 2 UNION ALL SELECT 'c', 3;

Java/JDBC批處理最佳實踐

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可獲取每條語句的更新計數或錯誤詳情。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved