602SQL-Úplná dokumentace Index  

Příkaz DELETE (SQL)

příkaz_DELETE ::= DELETE FROM [schema.]jméno_tabulky [ WHERE podmínka ]

Popis

Příkaz DELETE (neboli Searched DELETE) vymaže záznamy z dané tabulky. Není-li použita omezující podmínka, příkaz vymaže všechny záznamy v tabulce, jinak se vymažou pouze záznamy podmínce vyhovující. Záznamy jsou jen smazané, je možné je případně obnovit nebo definitivně uvolnit (automatické uvolňování mazaných záznamů lze nastavit pomocí příznaku kompatibility SQLOPT_EXPLIC_FREE). Počet zrušených záznamů je možné po provedení zjistit pomocí systémové proměnné @@ROWCOUNT.

Je-li tabulka prefixována jménem aplikace (na stejném serveru), tabulka se hledá v uvedené aplikaci (schématu).

Místo tabulky lze příkaz provádět i s pevným dotazem (VIEW), který umožňuje mazání záznamů (toto se rozpozná již při překladu).

Příkaz DELETE vyvolá DELETE trigger pro každý rušený záznam. BEFORE DELETE trigger se provede PŘED smazáním záznamu, AFTER DELETE trigger po smazaní. Dojde-li v triggeru k chybě, je obou případech příkaz DELETE odvolán.

Je-li tabulka, na níž je příkaz DELETE prováděn, nadřízenou tabulkou v aktivní referenční integritě (RI), mohou nastat dva případy:

Uživatel, který ruší záznamy, musí mít k této činnosti dostatek efektivních práv.

Rychlé mazání všech záznamů tabulky

Častým případem použití tohoto příkazu je kompletní vymazání obsahu tabulky. Pokud tabulka obsahuje indexy, bývá rychlejší indexy nejprve zrušit příkazem DROP INDEX, poté provést smazání příkazem DELETE (a uvolnění pomocí CALL Free_deleted) a indexy znovu vytvořit. Toto nejde použít, je-li index v definici referenční integrity, je-li třeba v případných DELETE triggerech použít tento index nebo je-li potřeba provést celé vymazání až do Free_deleted v jedné transakci.

Od verze 8.1 existuje pro tyto případy funkce Truncate_table použitelná i v SQL na serveru.


Příklady použití

Vymazat záznamy patřící do oddělení 1

DELETE FROM Zamestnan WHERE Oddeleni = 1

Vymazat záznamy, které mají hodnotu sloupce cislo větší než průměrnou

DELETE FROM Tab3
 WHERE cislo > (SELECT Avg(cislo) FROM Tab3);

Viz