批量插入數據 SQL 語句實現

一、什麼是批量插入數據?

批量插入數據是指一次性向資料庫中插入多條數據記錄,相比於單條記錄一個一個插入,批量插入可以提高插入效率,減少資料庫的壓力。

以常見的業務場景為例,例如向某個用戶批量添加多條收貨地址,如果一條一條地插入,無疑會佔用很大的系統資源,而使用批量插入技術則能夠大大減輕資料庫負擔。

二、如何實現批量插入數據?

常見實現批量插入數據的方式有兩種:使用多個 insert 語句進行插入,使用一條 insert into 語句進行插入。

1. 多個 insert 語句插入

在 PHP 中,可以使用 for 循環或 foreach 循環一條一條地向資料庫插入數據,如下所示:

$pdo = new PDO('mysql:host=localhost;dbname=test', 'root', '');
$array = [
    ['apple', 10],
    ['orange', 20],
    ['banana', 30],
];
foreach ($array as $value) {
    $stmt = $pdo->prepare("INSERT INTO `fruit` (`name`, `amount`) VALUES (?, ?)");
    $stmt->execute($value);
}

上述代碼實現了一條一條地向資料庫中插入數據,其中 $array 為待插入的數據數組。

2. 一條 insert into 語句插入

使用一條 insert into 語句進行插入可以進一步提高插入效率,示例如下:

// 聲明數據數組
$array = [
    ['apple', 10],
    ['orange', 20],
    ['banana', 30],
];
// 拼接 SQL 語句
$sql = "INSERT INTO `fruit` (`name`, `amount`) VALUES ";
foreach ($array as $value) {
    $sql .= "('" . $value[0] . "', '" . $value[1] . "'),";
}
$sql = rtrim($sql, ',');
// 執行 SQL 語句
$pdo = new PDO('mysql:host=localhost;dbname=test', 'root', '');
$stmt = $pdo->prepare($sql);
$stmt->execute();

上述代碼通過將多個數據記錄拼接成一個 SQL 語句,實現了一條 SQL 語句插入多條數據記錄。

三、如何優化批量插入數據?

雖然使用批量插入數據可以提高數據插入效率,但是在數據量較大或者需要頻繁進行批量插入的時候,還需要進一步對批量插入進行優化。

1. 使用事務

在執行批量插入的時候,很可能會出現其中某個數據插入失敗的情況,此時需要將插入操作放在一個事務中,確保數據的完整性和一致性。

try {
    $pdo->beginTransaction();
    foreach ($array as $value) {
        $stmt = $pdo->prepare("INSERT INTO `fruit` (`name`, `amount`) VALUES (?, ?)");
        $stmt->execute($value);
    }
    $pdo->commit();
} catch (Exception $e) {
    $pdo->rollBack();
}

上述代碼中,使用 beginTransaction() 和 commit() 方法開啟和提交一個事務,並在插入過程中捕獲異常並使用 rollBack() 方法進行回滾。

2. 設置批量大小

當插入數據量比較大時,默認的批量大小可能會導致插入失敗或者插入比較慢,此時可以在程序中根據實際情況設置合適的批量大小。

// 聲明批量大小
$batchSize = 500;
for ($i = 0; $i prepare($sql);
    $stmt->execute();
}

上述代碼中,設置 $batchSize 變數為批量大小,使用 for 循環和 array_slice() 方法將數據分塊處理,最終將分塊後的數據插入資料庫。

3. 關閉自動提交

如果資料庫在每次插入操作時都進行自動提交,可能會導致插入操作比較緩慢,此時可以關閉自動提交功能,手動控制事務的提交與回滾。

// 關閉自動提交
$pdo->setAttribute(PDO::ATTR_AUTOCOMMIT, 0);
$pdo->beginTransaction();
// 執行插入
$stmt = $pdo->prepare($sql);
$stmt->execute();
// 提交事務
$pdo->commit();
// 恢復自動提交
$pdo->setAttribute(PDO::ATTR_AUTOCOMMIT, 1);

上述代碼中,首先使用 setAttribute() 方法關閉自動提交功能,手動開啟一個事務並進行插入操作,最後手動提交事務並恢復自動提交狀態。

四、總結

批量插入數據是一種提高數據插入效率的重要策略,在開發過程中需要靈活應用,並結合實際情況進行多種優化。

本文介紹了使用多個 insert 語句和一條 insert into 語句進行批量插入數據的方法,並從使用事務、設置批量大小和關閉自動提交三個方面進行了擴展和優化。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/236289.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 11:59
下一篇 2024-12-12 11:59

相關推薦

  • Python讀取CSV數據畫散點圖

    本文將從以下方面詳細闡述Python讀取CSV文件並畫出散點圖的方法: 一、CSV文件介紹 CSV(Comma-Separated Values)即逗號分隔值,是一種存儲表格數據的…

    編程 2025-04-29
  • Python中讀入csv文件數據的方法用法介紹

    csv是一種常見的數據格式,通常用於存儲小型數據集。Python作為一種廣泛流行的編程語言,內置了許多操作csv文件的庫。本文將從多個方面詳細介紹Python讀入csv文件的方法。…

    編程 2025-04-29
  • Python3支持多行語句

    Python3是一種高級編程語言,開發人員可以輕鬆地使用該語言編寫簡單到複雜的代碼。其中Python3支持多行語句,方便開發人員編寫複雜的代碼,提高代碼的可讀性和可維護性。 一、使…

    編程 2025-04-29
  • 如何用Python統計列表中各數據的方差和標準差

    本文將從多個方面闡述如何使用Python統計列表中各數據的方差和標準差, 並給出詳細的代碼示例。 一、什麼是方差和標準差 方差是衡量數據變異程度的統計指標,它是每個數據值和該數據值…

    編程 2025-04-29
  • Python多線程讀取數據

    本文將詳細介紹多線程讀取數據在Python中的實現方法以及相關知識點。 一、線程和多線程 線程是操作系統調度的最小單位。單線程程序只有一個線程,按照程序從上到下的順序逐行執行。而多…

    編程 2025-04-29
  • Python for循環語句列印九九乘法表

    本篇文章將詳細介紹如何使用Python的for循環語句列印九九乘法表。列印九九乘法表是我們初學Python時經常練習的一項基礎操作,也是編寫Python程序的基本能力之一。 1、基…

    編程 2025-04-29
  • Python兩張表數據匹配

    本篇文章將詳細闡述如何使用Python將兩張表格中的數據匹配。以下是具體的解決方法。 一、數據匹配的概念 在生活和工作中,我們常常需要對多組數據進行比對和匹配。在數據量較小的情況下…

    編程 2025-04-29
  • Python爬取公交數據

    本文將從以下幾個方面詳細闡述python爬取公交數據的方法: 一、準備工作 1、安裝相關庫 import requests from bs4 import BeautifulSou…

    編程 2025-04-29
  • Hibernate日誌列印sql參數

    本文將從多個方面介紹如何在Hibernate中列印SQL參數。Hibernate作為一種ORM框架,可以通過列印SQL參數方便開發者調試和優化Hibernate應用。 一、通過配置…

    編程 2025-04-29
  • Python數據標準差標準化

    本文將為大家詳細講述Python中的數據標準差標準化,以及涉及到的相關知識。 一、什麼是數據標準差標準化 數據標準差標準化是數據處理中的一種方法,通過對數據進行標準差標準化可以將不…

    編程 2025-04-29

發表回復

登錄後才能評論