という名前のテーブルがありますitems
。
構造は次のとおりです。
{name, id, category_id}
テーブルには不明な数のレコードがあります。各カテゴリのレコード数を最大数、たとえば 20 に制限する必要があります。
擬似
DELETE FROM items
WHERE (SELECT COUNT(category_id) FROM items)> 20
LIMIT (SELECT COUNT(category_id) FROM items) - 20
という名前のテーブルがありますitems
。
構造は次のとおりです。
{name, id, category_id}
テーブルには不明な数のレコードがあります。各カテゴリのレコード数を最大数、たとえば 20 に制限する必要があります。
DELETE FROM items
WHERE (SELECT COUNT(category_id) FROM items)> 20
LIMIT (SELECT COUNT(category_id) FROM items) - 20
大きなテーブルがある場合、最も効率的な方法は、そのテーブルを再作成することです。
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を消費するものであり、切り捨てはこれを行いません.
そうしないと、削除フェーズ中にデータベースを停止する可能性が高くなります。少量のデータであれば問題ありません。
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)