Kann ich dieselbe Spalte aktualisieren, die ich für einen Join verwende? Es scheint, als könnte ich das, aber mein Skript stürzt ab, wenn ich es tue.MySQL Ein JOIN ON-Feld ist gültig oder nicht? "JOIN ON a = b SET a = c"
Hintergrund: Ich habe eine alte Datenbank, die ich migriere. Ich verarbeite es durch eine Menge MySQL-Abfragen, die in einer PHP-Schleife laufen. Die Schleifenarbeiter sind großartig, die jeweils 0,5 bis 1 MB Speicher abfragen, um sie zu verarbeiten. Bis es trifft diese Abfrage und plötzlich nimmt es 101% von was auch immer Speicher ich PHP zugewiesen haben:
UPDATE a.t1
INNER JOIN t2
ON t1.category = t2.oldcategory
SET t1.category = t2.newcategory
WHERE t1.category <> '';
Wenn memory_limit auf 128M geworfen gesetzt wurde der Fehler war:
PHP Fatal error: Allowed memory size of 134217728 bytes exhausted
(tried to allocate 12288 bytes)
Als ich das memory_limit gestoßen der Fehler 256M ist:
PHP Fatal error: Allowed memory size of 268435456 bytes exhausted
(tried to allocate 32768 bytes)
Aber gerade diese ähnliche Abfrage läuft ganz gut:
UPDATE a.t1
INNER JOIN t2
ON t1.category = t2.oldcategory
SET t1.series = t2.series_term
WHERE t1.category <> '' AND t2.newcategory <> '';
PHP-Code auf Anfrage:
$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>";
}
}
Gibt es etwas, illegal oder rekursive über SET
auf der gleichen Säule verwendet unter Verwendung für ON
?
UPDATE:
ich nur zwei kleine Testtabellen erstellt und lief erfolgreich diese Abfrage:
# works
UPDATE table1 t1
JOIN table2 t2
ON t1.column1 = t2.column1
SET t1.column1 = t2.column2
WHERE t1.column1 <> '';
UPDATE 2:
Ich bearbeitete die WHERE-Klausel und jetzt läuft es richtig. 19 Sekunden unter Verwendung von 0,04 MB Speicher:
UPDATE a.t1
INNER JOIN t2
ON t1.category = t2.oldcategory
SET t1.category = t2.newcategory
WHERE t1.category <> '' AND t1.category <> t2.newcategory;
Bitte auch PHP-Code anzeigen, sehen Sie möglicherweise 'memory_limit' in' php.ini' gesetzt –
Statt ein tun Update mit der gesamten Datenbank, können Sie es nicht in Chunks zum Beispiel für jedes 50.000 Update anstelle von Update-Abfragen auf einmal setzen. – rahul
Akshay Hegde, mein PHP-Limit ist auf 256M eingestellt, angehoben von 128M nach dem ersten Fehler. – Slam