【问题标题】:how to delete from mysql multiple rows depending on other rows in another table如何根据另一个表中的其他行从mysql中删除多行
【发布时间】:2017-07-09 18:31:35
【问题描述】:

我有一个名为“电话”的表包含所有成员的电话号码,每个成员都有唯一的 id,还有另一个名为 posts 的表,posts 表有很多行,每个帖子都有自己的成员 id 和另一个单元格

我需要根据分支单元格从帖子表中收集所有成员 ID,并从电话表中删除从帖子表中收集的成员 ID

我试过了,但它给了我mysql服务器丢失连接的错误消息

delete from `phones` where `mid` in(select `uid` from `posts` where `branches` = 'contact');

注意:我在本地服务器上使用 mysql 工作台

更新

在我设置下面的首选项后,此查询也有效

进入Edit -> Preferences -> SQL Editor并增加参数:DBMS连接读取超时(以秒为单位)。例如:86400。

关闭并重新打开 MySQL Workbench。终止您之前可能正在运行的查询并再次运行该查询。

感谢@scaisEdge

【问题讨论】:

  • 查询正确,不知道为什么会丢失连接。这些是大桌子吗?如果是这样,可能由于branches 上缺少索引,选择查询花费的时间太长?
  • 表格很大,分支列没有索引
  • @mohamad,你在拐弯抹角。如果表很大并且branches 上没有索引,则将扫描整个表,并且根据 MySQL 可用的硬件和资源,它可能需要比 DB 连接超时更长的时间。有了索引,你的查询是正确的。

标签: mysql


【解决方案1】:

您的查询似乎正确.. 无论如何您可以尝试使用内部联接

delete  `phones`.*
from `phones` 
inner join `posts`  on `phones`.`mid`  = `posts`.`uid` 
        and `posts`.`branches` = 'contact'

内部连接不使用 IN 子句,因此您可以绕过所涉及的限制

如果错误仍然存​​在,请尝试增加读取超时时间

转到编辑 -> 首选项 -> SQL 编辑器并增加参数:DBMS 连接读取超时(以秒为单位)。例如:86400。

关闭并重新打开 MySQL Workbench。终止您之前可能正在运行的查询并再次运行该查询。

【讨论】:

  • 不确定为什么这会起作用,而不是问题中发布的那个?
  • @AllenKing 如果 IN 子句中的元素数量很高,您可以达到限制.. 所以内部连接避免这种情况
  • 好的。我的怀疑是没有设置正确的索引。因此,即使加入也不能保证有效。不良索引只能通过在表上放置适当的索引来修复:-)
  • 可能是 .. 但索引对性能的影响很差 .. max_packect_size 。对所涉及数据量的影响..
  • @scaisEdge 错误代码:2013。在查询期间丢失与 MySQL 服务器的连接
猜你喜欢
  • 1970-01-01
  • 2019-05-21
  • 1970-01-01
  • 1970-01-01
  • 2021-08-09
  • 1970-01-01
  • 2010-12-19
  • 1970-01-01
  • 2010-12-08
相关资源
最近更新 更多