gpt4 book ai didi

php - MySQL 设置 JOIN ON 字段是否有效? "JOIN ON a = b SET a = c"

转载 作者:行者123 更新时间:2023-11-29 18:23:01 28 4
gpt4 key购买 nike

我可以更新用于连接的同一列吗?看起来我可以,但是当我这样做时我的脚本崩溃了。

背景:我有一个正在迁移的旧数据库。我正在通过 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)

当我将内存限制提高到 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 是否存在非法或递归问题?

更新:

我刚刚创建了两个小测试表并成功运行了此查询:

# 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 内存在 0.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;

最佳答案

不,你可以t update same columns which are used in join statement.
Think about the logic.
It updates one row and it has to recheck the value again since it
使用同一列连接。所以这变成了无休止的递归,这将导致内存不足异常。

为什么不先将需要更新的id和值保存在键值数组中。然后运行一个循环并单独更新?

SELECT t1.id,t2.newcategory from t1
INNER JOIN t2
ON t1.category = t2.oldcategory

运行 foreach循环结果列表并更新每一行

foreach($queryResul as $row){
UPDATE t1 SET t1.category = $row->newcategory where t1.id = $row->id; }

关于php - MySQL 设置 JOIN ON 字段是否有效? "JOIN ON a = b SET a = c",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46418396/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com