如何限制此DELETE查询?

时间:2013-12-10 12:59:59

标签: mysql

我已经执行了这个查询,我想把它放在PHP脚本的while循环中。因此,我需要将要删除的行限制为50 000.任何人都可以向我解释我是如何做到这一点的吗?

我的查询是:

DELETE a
FROM activities a INNER JOIN backup_activities b
ON a.id = b.id
LIMIT 50000 ??????????

谢谢!

3 个答案:

答案 0 :(得分:2)

试试这个:

DELETE a
FROM activities AS a
JOIN
  ( SELECT b.id
    FROM   backup_activities b
    ORDER BY b.id
    LIMIT 50000
  ) AS tmp
  ON tmp.id = a.id 

答案 1 :(得分:2)

您可能需要进行相关删除。但是,基本上像AZIZ一样只能部分工作,因为它可能不包含活动中的ID,或者返回已经删除的ID。您需要确保获得仍然可用的ID。

这应该有所帮助,显然可以将5更改为您想要的任何限制计数。正如您所看到的,子查询只获取活动和backup_activities表中的ID。

DELETE a1 
   FROM activities a1 
      JOIN ( select a.id
                from activities a
                JOIN backup_activities b 
                where a.id = b.id
                limit 5 ) killThese
         on a1.id = killThese.id

反馈,考虑。

虽然其他解决方案正在运行,但我们不知道您的数据是如何在相应的表中填充的,请考虑以下方案......

表活动包含ID 1-100的记录 表Backup_Activities的记录为1-100。 现在,请考虑查询限制为20条记录。

从backup_activities返回的20条记录的连接仅为ID 1-20。因此,首先通过删除活动表中的ID为1-20的记录。

现在,第二遍。试图删除20条记录。 backup_activities表仍然返回相同的20个记录1-20个ID,因此NOTHING将被删除。

现在,再考虑一下我的解决方案。由于我的查询已加入活动,因此第一次传递将返回ID 1-20并从活动表ID 1-20中删除。现在,SECOND传递了我的查询...由于ID的JOIN,它返回ID 21-40并再次从活动表中删除。

同样,不知道你的表是如何处理的,而只是考虑你的查询将会做什么。

答案 2 :(得分:2)

这个怎么样?

DELETE a
FROM activities a
WHERE EXISTS (
    SELECT 1
    FROM backup_activities b
    WHERE a.id = b.id
)
LIMIT 50000

顺便说一句

  

“我不认为删除限制有效..它不会执行”

MySQL在DELETE上支持LIMIT。请参阅http://dev.mysql.com/doc/refman/5.5/en/delete.html

相关问题