首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法删除数据,MySQL

问无法删除数据,MySQL
EN

Stack Overflow用户
提问于 2011-12-06 04:44:15
回答 2查看 724关注 0票数 0

我有一个大型数据库,其中包含5个表中的大约4000万行。我需要从一个表中删除其中一列的值在第二个表中不存在的行。

我尝试编写查询来删除一些行,并将不想删除的行插入到另一个表中:

DELETE FROM user_followersid WHERE followersIds_generatedId IN (SELECT * FROM generatedfollowers)

CREATE TABLE tempfollowersids as SELECT * FROM user_followersid WHERE followersIds_generatedId IN (SELECT generatedId from followersid WHERE followerId IN (SELECT * FROM topusers));

删除操作耗费大量时间,每次删除都会失败,并报告以下错误:

ERROR 1206 (HY000): The total number of locks exceeds the lock table size

我甚至尝试过使用LIMIT一次只删除几行,但这也很耗时。我知道IN非常慢。但我找不到任何替代方法来编写我的查询。

对如何删除行有什么建议吗?

EN

回答 2

Stack Overflow用户

发布于 2011-12-06 04:48:32

你可以说:

第二个表中存在某列具有不的值的

那么,您的查询不应该是:

代码语言:javascript
复制
DELETE FROM user_followersid 
WHERE followersIds_generatedId NOT IN 
    (SELECT DISTINCT id FROM generatedfollowers)
票数 4
EN

Stack Overflow用户

发布于 2011-12-08 03:33:41

您的IN语句:

代码语言:javascript
复制
DELETE FROM user_followersid 
WHERE followersIds_generatedId IN 
      ( SELECT generatedId
        FROM generatedfollowers 
      )

can也可以用EXISTS编写,如下所示:

代码语言:javascript
复制
DELETE FROM user_followersid AS uf
WHERE EXISTS 
      ( SELECT * 
        FROM generatedfollowers AS gf 
        WHERE gf.generatedId = uf.followersIds_generatedId
      )

对于JOIN,如下所示:

代码语言:javascript
复制
DELETE uf 
FROM user_followersid AS uf
  JOIN generatedfollowers AS gf 
    ON gf.generatedId = uf.followersIds_generatedId

不能将LIMIT x与第三个(join)语句一起使用。

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

https://stackoverflow.com/questions/8391606

复制
相关文章

相似问题

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