2010-01-06 66 views
8

我想插入約50000 MySQL查詢在MySQL數據庫, 「插入」爲了這個,我有2個選項,導入大文件

1-直接導入(.SQL)文件: 繼錯誤發生 「您可能試圖上傳過大的文件,請參閱文檔以瞭解如何解決此限制的方法。」

2-使用php代碼以(.sql)格式從不同塊中插入這些查詢文件。 這裏是我的代碼:

<?php 

// Configure DB 
include "config.php"; 

// Get file data 
$file = file('country.txt'); 

// Set pointers & position variables 
$position = 0; 
$eof = 0; 

while ($eof < sizeof($file)) 
{ 
    for ($i = $position; $i < ($position + 2); $i++) 
    { 
     if ($i < sizeof($file)) 
     { 
      $flag = mysql_query($file[$i]); 

      if (isset($flag)) 
      { 
       echo "Insert Successfully<br />"; 
       $position++; 
      } 

      else 
      { 
       echo mysql_error() . "<br>\n"; 
      } 
     } 

     else 
     { 
      echo "<br />End of File"; 
      break; 
     } 
    } 

    $eof++; 
} 

?> 

但內存大小錯誤然而發生,我有擴展內存限制從128M到256M甚至512M。

那麼我認爲如果我能能夠在一個時間來加載從(.SQL)文件像1000限量行執行MySQL查詢那麼它可能是從文件導入的所有記錄到數據庫中。 但在這裏我沒有對如何處理文件的起始位置到結束,我怎麼可以更新的起點和終點的位置,所以它不會從取.sql文件的先前獲取行的想法。

+0

你重新啓動服務,並再次嘗試在改變memory_limit的 – Treby 2010-01-06 06:18:35

+0

有你「指[編者按]到文檔的方法來解決這個限制「? – Boldewyn 2010-01-07 08:46:13

回答

4

這裏你需要的代碼,現在美化! = d

<?php 

include('config.php'); 

$file = @fopen('country.txt', 'r'); 

if ($file) 
{ 
    while (!feof($file)) 
    { 
     $line = trim(fgets($file)); 
     $flag = mysql_query($line); 

     if (isset($flag)) 
     { 
      echo 'Insert Successfully<br />'; 
     } 

     else 
     { 
      echo mysql_error() . '<br/>'; 
     } 

     flush(); 
    } 

    fclose($file); 
} 

echo '<br />End of File'; 

?> 

基本上它,而不是打開在內存中的整個文件讀取和執行SQL語句的小塊(一個襯墊)代碼的貪心不足的版本。

2

不必加載整個文件到內存中,這是何等的使用file功能時做的,一個可能的解決方案是通過線上,線下閱讀使用fopenfgets,並fclose一個combinaison - 的想法是隻讀你需要的東西,處理你有的行,然後纔讀下一個。


Additionnaly,你可能想看看這個答案:Best practice: Import mySQL file in PHP; split queries

沒有公認的答案,但一些給出的答案可能已經幫你...

+0

Awww ...我正在發佈那個。 :P – 2010-01-06 06:36:09

+0

@Alix:hu ^^我們的兩個答案之間不到1分鐘 - 你寫作一個例子的時間;-) – 2010-01-06 06:37:55

0

我最近讀到插入大量的查詢迅速到數據庫中。文章建議使用sleep()(或usleep)函數在查詢之間延遲幾秒鐘,以免超載MySQL服務器。

1

使用命令行客戶端,這是更爲有效,並且應該輕鬆處理50K鑲:

mysql -uUser -p <db_name> < dump.sql