Záznamy tímto způsobem nelze smazat, hlavní problém spočívá v tom, že nemůžete použít poddotaz k určení hodnoty klauzule LIMIT.
Toto funguje (testováno v MySQL 5.0.67):
DELETE FROM `table`
WHERE id NOT IN (
SELECT id
FROM (
SELECT id
FROM `table`
ORDER BY id DESC
LIMIT 42 -- keep this many records
) foo
);
Zprostředkující poddotaz je Požadované. Bez něj bychom narazili na dvě chyby:
- Chyba SQL (1093):V klauzuli FROM nemůžete určit cílovou tabulku „tabulka“ pro aktualizaci - MySQL vám neumožňuje odkazovat na tabulku, kterou odstraňujete, v rámci přímého poddotazu.
- Chyba SQL (1235):Tato verze MySQL zatím nepodporuje poddotaz „LIMIT &IN/ALL/ANY/SOME“ - Klauzuli LIMIT nemůžete použít v přímém poddotazu operátoru NOT IN.
Naštěstí nám použití mezidotazu umožňuje obejít obě tato omezení.
Nicole poukázala na to, že tento dotaz lze výrazně optimalizovat pro určité případy použití (jako je tento). Doporučuji si přečíst tuto odpověď také, abyste zjistili, zda se vám hodí.