我想在mysql db中为'insert'插入大约50,000个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 :(得分: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语句。
答案 1 :(得分:2)
使用file,{{{ 3}}和fopen
- 想法只是阅读你需要的东西,处理你所拥有的那些行,然后才读下几行。
另外,您可能想看一下这个答案:fgets
尚未接受答案,但某些答案可能已经对您有所帮助......
答案 2 :(得分:1)
使用命令行客户端,效率更高,并且应该可以轻松处理50K插入:
mysql -uUser -p <db_name> < dump.sql
答案 3 :(得分:0)