我可以更新我用於連接的同一列嗎?看起來我可以,但我的腳本崩潰了。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