sql >> Databáze >  >> RDS >> Mysql

SQL dotaz:Smazat všechny záznamy z tabulky kromě posledních N?

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:

  1. 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.
  2. 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í.



  1. Ladění soukromých procedur

  2. Jak spojit dvě tabulky mysql?

  3. Jak předám seznam jako parametr v uložené proceduře?

  4. Detekce přírůstkových změn databáze (Oracle až MongoDB ETL)