我想删除date
包含2018
的所有行,但保留前100行。
delete from archive where date like '2018%' offset 100;
offset 100
附近的Suntax错误。
答案 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
当然,恰恰相反;选择那些您不想删除的行,获取主键并使用LIKE
和NOT 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;