我希望有更快的方法来执行此操作,因为此查询需要永远运行。我希望能同时学到一些东西。
我有两个独立数据库的两个表。我需要合并ID。因为第二个数据库有多个引用id的表,所以我必须更改所有那些
我在id前添加了数字9696,因为没有id以9xxx开头。 因此,第一个查询进入并更改所有ID,但将9696放在前面以防止任何交叉ID更改。第二个从id中删除所有9696,所以我们得到原始id。
我正在为此做十多个其他表...但我觉得必须有更好的方法。也许没有更好的方法..但我不得不问......我已经尝试搜索,看看我是否能找到,但我找到的只是如何更改主键。不是更改所有引用的更好方法。真的有更好的方法吗?
$userResult = $mysqli->query("SELECT * FROM members WHERE forum_id!='0' AND forum_id != id");
while ($userRow = $userResult->fetch_assoc()){
$mysqli->query("UPDATE operation SET member_id='9696".$userRow['forum_id']."' WHERE member_id='".$userRow['id']."'");
}
$mysqli->query("UPDATE operation SET leader=REPLACE(leader, '9696', '') WHERE leader LIKE '9696%'");
答案 0 :(得分:1)
使用多表更新查询和算术而不是字符串操作,您可以更有效地执行此操作,如下所示:
UPDATE
members m join
operation o on
m.id = o.member_id
SET o.member_id= m.forum_id + 10000
WHERE m.forum_id !=0 AND m.forum_id != id;
UPDATE operation SET leader=leader-10000 WHERE leader > 1000;
这假设member_id和forum_id是数字,并且你的最大id值低于10,000(如果不是那么只增加你添加的数量并相应减去)。
如果你必须使用单个表,通过mysqli,那么这至少可能会更好:
$userResult = $mysqli->query("SELECT forum_id, id FROM members WHERE forum_id!='0' AND forum_id != id");
while ($userRow = $userResult->fetch_assoc()){
$mysqli->query("UPDATE operation SET member_id=".$userRow['forum_id']."+10000' WHERE member_id='".$userRow['id']."'");
}
$mysqli->query("UPDATE operation SET leader=leader-10000 WHERE leader > 10000");
请注意,只有从第一次选择中检索所需的字段才能获得较小的性能提升。