删除除前100个之外的所有内容

时间:2018-03-27 07:09:48

标签: mysql

我想删除date包含2018的所有行,但保留前100行。

delete from archive where date like '2018%' offset 100;

offset 100附近的Suntax错误。

2 个答案:

答案 0 :(得分:2)

正如评论中已经提到的,您的查询中的问题是使用OFFSET而没有LIMIT

解决方案1:

删除所需条目的一种方法是为每个条目提供行号,以便您可以获取数量大于100的那些主键。然后,只需使用IN删除主键位于所选条目中的所有条目。

DELETE FROM archive WHERE id IN (
   SELECT id FROM (
      SELECT a.id AS id, @r := @r + 1 AS rownum
      FROM archive AS a, (SELECT @r := 0) AS r
      WHERE date LIKE '2018%'
   ) AS t WHERE rownum > 100
);

解决方案2

当然,恰恰相反;选择那些您不想删除的行,获取主键并使用LIKENOT IN删除其他所有内容。

DELETE FROM archive
WHERE date LIKE '2018%' AND id NOT IN (
   SELECT id
   FROM archive
   WHERE date LIKE '2018%'
   LIMIT 100
);

<强>更新

要使用第二个解决方案来解决您使用MariaDB版本所面临的问题,只需使用另一个SELECT子句将子查询包装在另一个子查询中,然后再使用NOT IN

DELETE FROM archive
WHERE date LIKE '2018%' AND id NOT IN (
   SELECT * FROM (
      SELECT id
      FROM archive
      WHERE date LIKE '2018%'
      LIMIT 100
   ) AS t
);

注意:我使用id的位置使用您的主键,如果它不是id

答案 1 :(得分:1)

你需要在抵消之前有一个限制。试试这个。这应该工作

delete from archive where date like '2018%' limit 1945694608375953174 offset 100;