如何删除MySQL中第n行之后的每条记录?
在mysql中,我可以查询select * ... LIMIT 10, 30
,其中10表示要跳过的记录数。如何删除MySQL中第n行之后的每条记录?
有没有人知道我可以在删除语句中删除前10条记录后的每条记录都做同样的事情?
考虑有在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;
有些问题:是否定义了如何在修改这样的表时添加'auto_increment'数字?它会保持所需的顺序,如果是的话,在测试时:这是“巧合”还是定义的行为?另外:删除列后mysql是否重置'auto_increment'数字?如果不是,您可能需要明确设置,否则它可能会继续计数。最后:这对于大餐桌会变得如何高贵? – Nanne
如果'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
我认为“不工作”的原因是直接提到同一张表。 –
当删除很多行,这是一个有效的技巧:
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.
什么是关键的表? –
这是一个GUID字符串。 – Roman
应该提到这个被删除的答案我认为:'从表中删除ID IN(从表中选择ID 10,30)'。 @Am评论说,这在“这个版本的MySQL”中不起作用。因此,尽管这不是问题的答案,但对其他答复者可能会有所帮助:) – Nanne