随机删除未知数量的记录

时间:2012-10-29 08:57:57

标签: mysql random conditional sql-delete

我有一张名为items的桌子 结构是:  {name, id, category_id}

表中有未知数量的记录,我需要将每个类别的记录数限制为MAX数,例如20。

DELETE FROM items
WHERE (SELECT COUNT(category_id) FROM items)> 20
LIMIT (SELECT COUNT(category_id) FROM items) - 20

2 个答案:

答案 0 :(得分:2)

DELETE FROM items 
WHERE (category_id,id) not in (
  SELECT category_id, id FROM items  a WHERE id IN (
     SELECT id FROM items s 
     WHERE a.category_id = s.category_id
     ORDER BY category_id LIMIT 20) 
  ORDER BY  id)

答案 1 :(得分:2)

如果您有一个大表,最有效的方法是重新创建该表:

create table items_temp like items;
INSERT into items_temp (id, category_id, ... ) 
  SELECT id, category_id, ... from items orig
  WHERE id in (
     SELECT id from items items_select
     WHERE orig.category_id = items_select.category_id
     ORDER by category_id LIMIT 20
     );
RENAME table items to items_old, items_temp to items;

编辑: TRUNCATE table items_old 不要删除 - 这是我们试图避免的 - 删除实际上会删除每一行并遵守外部约束,这将需要这么多cpu和IO,truncate不会这样做。

否则,您很可能会在删除阶段删除数据库。如果是少量数据,没什么大不了的。