首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MYSQL优化的主键查询更改

MYSQL优化的主键查询更改
EN

Stack Overflow用户
提问于 2014-07-30 16:11:03
回答 1查看 47关注 0票数 0

我希望有一种更快的方法来做到这一点,因为这个查询要花费很长时间才能运行。同时我也希望能学到一些东西。

我有两个独立数据库的两张桌子。我需要合并身份证。因为第二个数据库有多个引用id的表,所以我必须首先更改所有这些表。

我在id前面添加了9696号,因为没有一个id以9xxx开头。因此,第一个查询进入并更改所有id,但将9696放在前面,以防止任何跨id更改。第二个从id中移除所有9696,所以我们得到了原始id。

还有十几张桌子是我做这件事的。但我觉得一定有更好的办法。也许没有更好的方法..。但我不得不问..。我试着搜索,看看是否能找到,但我发现的只是如何更改主键。不是改变所有引用的更好的方法。真的有更好的方法吗?

代码语言:javascript
复制
$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%'");
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-30 16:17:48

您可以通过多表更新查询和算术(而不是字符串操作)更有效地完成此操作,如下所示:

代码语言:javascript
复制
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使用单个表来完成此操作,那么至少这样做可能更好:

代码语言:javascript
复制
$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中检索您需要的字段,才能给您带来较小的性能提升。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25041772

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档