我可以更新我用于连接的同一列吗?看起来我可以,但我的脚本崩溃了。MySQL设置JOIN ON域是否有效? “加入a = b SET a = c”
背景:我有一个旧数据库,我正在迁移。我正在通过在PHP循环中运行的大量MySQL查询处理它。循环工作人员很好,每个查询需要0.5到1 MB的内存来处理。直到它击中这个查询,突然需要什么记忆我已经分配给PHP的101%:
UPDATE a.t1
INNER JOIN t2
ON t1.category = t2.oldcategory
SET t1.category = t2.newcategory
WHERE t1.category <> '';
当memory_limit的设置为128M抛出的错误是:
PHP Fatal error: Allowed memory size of 134217728 bytes exhausted
(tried to allocate 12288 bytes)
当我碰到memory_limit的到256M的错误是:
PHP Fatal error: Allowed memory size of 268435456 bytes exhausted
(tried to allocate 32768 bytes)
但是这非常类似于查询运行得很好:
UPDATE a.t1
INNER JOIN t2
ON t1.category = t2.oldcategory
SET t1.series = t2.series_term
WHERE t1.category <> '' AND t2.newcategory <> '';
PHP代码的请求:
$queries = array (
// dozens of MySQL queries here, like this:
["Count users",
"SELECT id from $s2.$usr;"
],
)
foreach ($queries as $query){
$mtime = time();
$result = mysqli_query($link, $query[1]);
$mem = number_format((memory_get_usage()/1024/10124),2);
$mtime = time() - $mtime;
$mtime = gmdate("i:s", $mtime);
if ($result) {
$rows = number_format(mysqli_affected_rows($link));
echo "<tr><td>$mtime</td><td>$rows</td><td>$query[0] — $mem Mb</td></tr>";
} else {
$rows = mysqli_error($link);
echo "<tr><td>X</td><td>X</td><td>".$query[0]."<br><span style='color:red;'>".$rows."</span></td></tr>";
}
}
有什么关于用于ON
同一列使用SET
非法或递归?
UPDATE:
我只是创建了两个小的测试表,并成功运行此查询:
# works
UPDATE table1 t1
JOIN table2 t2
ON t1.column1 = t2.column1
SET t1.column1 = t2.column2
WHERE t1.column1 <> '';
更新2:
我编辑的WHERE子句,现在它在正常运行。使用0.04 Mb内存19秒:
UPDATE a.t1
INNER JOIN t2
ON t1.category = t2.oldcategory
SET t1.category = t2.newcategory
WHERE t1.category <> '' AND t1.category <> t2.newcategory;
请出示PHP代码,以及,你可能会看到'memory_limit'在'php.ini' –
设置做了,而不是使用整个数据库进行更新,不能将其设置为块,例如,对于每50,000次更新,而不是一次更新查询。 – rahul
Akshay Hegde,我的PHP限制设置为256M,从第一个错误后从128M提高。 – Slam