如何删除MySQL中第n行之后的每条记录?

问题描述:

在mysql中,我可以查询select * ... LIMIT 10, 30,其中10表示要跳过的记录数。如何删除MySQL中第n行之后的每条记录?

有没有人知道我可以在删除语句中删除前10条记录后的每条记录都做同样的事情?

+0

什么是关键的表? –

+0

这是一个GUID字符串。 – Roman

+0

应该提到这个被删除的答案我认为:'从表中删除ID IN(从表中选择ID 10,30)'。 @Am评论说,这在“这个版本的MySQL”中不起作用。因此,尽管这不是问题的答案,但对其他答复者可能会有所帮助:) – Nanne

考虑有在MySQL没有rowId(如在甲骨文),我建议如下:

alter table mytable add id int unique auto_increment not null; 

这将自动编号在select语句的顺序你行无条件或订单的。

select * from mytable; 

随后,在检查顺序与您的需求(也许表的转储)

delete from mytable where id > 10; 

最后一致的,你可能想要删除的那场

alter table mytable drop id; 
+0

有些问题:是否定义了如何在修改这样的表时添加'auto_increment'数字?它会保持所需的顺序,如果是的话,在测试时:这是“巧合”还是定义的行为?另外:删除列后mysql是否重置'auto_increment'数字?如果不是,您可能需要明确设置,否则它可能会继续计数。最后:这对于大餐桌会变得如何高贵? – Nanne

+0

如果'auto_increment_increment'不是1(在多主设置中),这将无法正常工作。另外,如果桌子很大,则需要很长时间才能运行。 –

以下将工作:

DELETE 
FROM table_name 
WHERE id IN 
    (SELECT id 
    FROM table_name 
    ORDER BY   --- whatever 
    LIMIT 10, 30 
) 

但这种意愿:

DELETE 
FROM table_name 
WHERE id IN 
    (SELECT id 
    FROM 
     (SELECT id 
     FROM table_name 
     ORDER BY   --- whatever 
     LIMIT 10, 30 
    ) AS tmp 
) 

这也太:

DELETE table_name 
FROM table_name 
    JOIN 
    (SELECT id 
     FROM table_name 
     ORDER BY   --- whatever 
     LIMIT 10, 30 
    ) AS tmp 
    ON tmp.id = table_name.id 
+0

我认为“不工作”的原因是直接提到同一张表。 –

当删除很多行,这是一个有效的技巧:

CREATE TABLE new LIKE real; -- empty table with same schema 
INSERT INTO new SELECT * FROM real ... LIMIT 10; -- copy the rows to _keep_ 
RENAME TABLE real TO old, new TO real; -- rearrange 
DROP TABLE old; -- clean up.