我希望有一种更快的方法来做到这一点,因为这个查询要花费很长时间才能运行。同时我也希望能学到一些东西。
我有两个独立数据库的两张桌子。我需要合并身份证。因为第二个数据库有多个引用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%'");发布于 2014-07-30 16:17:48
您可以通过多表更新查询和算术(而不是字符串操作)更有效地完成此操作,如下所示:
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");请注意,只有从第一个select中检索您需要的字段,才能给您带来较小的性能提升。
https://stackoverflow.com/questions/25041772
复制相似问题