有一个包含24500行数据的MySQL表,并且有一个文本文件,需要将26000个字符串数据插入MySQL,问题是这个26000字符串在MySQL表中复制数据,所以我们需要比较它们,只插入新/唯一。
cadastreArray - 文本文件中的数组
districtArray - mysql数组
当我尝试
时foreach ($cadastreArray as $cadastreValue) {
$districtExist = false;
foreach ($districtArray as $districtData) {
if ($cadastreValue[0] == $districtData['1']) {
$districtExist = true;
break;
}
}
}
if(!$districtExist) { MySQL INSERT ... }
我的执行时间错误,甚至3分钟都没有。 也许你可以提供更好/更快的方式?
答案 0 :(得分:2)
可能您可以将mysql字段设置为唯一,因此当您要插入时,它将不会插入并将生成错误编号并将继续执行。所以你不需要比较。
你可以做的另一件事是你可以在php.ini中增加max_execution_time
答案 1 :(得分:1)
另一种选择。将26k文本文件加载到临时表中(LOAD DATA INFILE ...将快速执行此操作)。
然后你可以根据一个查询执行插入操作,该查询将临时表和LEFT JOIN映射到整个表,检查整个表上的字段是否为NULL。
这里的简单示例脚本: -
<?php
$file = "SomeTextFile.txt";
$sql = "CREATE TEMPORARY TABLE cadastre
(
field1 INT,
field2 VARCHAR(255),
etc...
)";
if(!($db->query($sql)))
{
die($db->error());// if error, stop script
}
if(!($db->query("LOAD DATA INFILE '$file' INTO TABLE cadastre")))
{
die($db->error());// if error, stop script
}
$sql = "INSERT INTO district (field1, field2, field3, ......)
SELECT a.field1, a.field2, a.field3
FROM cadastre a
LEFT OUTER JOIN district b
ON a.field1 = b.field1
WHERE b.field1 IS NULL";
if(!($db->query($sql)))
{
die($db->error());// if error, stop script
}
?>
确保临时表和要插入的表添加了有用的索引。