1. Co je příkaz TRUNCATE?
Základní koncept příkazu TRUNCATE
Příkaz TRUNCATE v MySQL je příkaz používaný k odstranění všech dat z tabulky najednou. Na rozdíl od příkazu DELETE, který odstraňuje řádky jednotlivě, TRUNCATE interně znovu vytvoří tabulku, aby vymazal její data. To ho činí vysoce efektivním pro efektivní mazání velkého množství dat.
Základní syntaxe
Základní syntaxe příkazu TRUNCATE je následující:
TRUNCATE TABLE table_name;
Tím se odstraní všechny řádky ze zadané tabulky a resetuje se do počátečního stavu. Nicméně, protože smazaná data nelze obnovit, je při používání tohoto příkazu nutná opatrnost.
Příklad: Základní použití
V níže uvedeném příkladu je vytvořena tabulka users a poté vymazána pomocí příkazu TRUNCATE:
CREATE TABLE users (
id INT AUTO_INCREMENT,
name VARCHAR(100),
PRIMARY KEY (id)
);
INSERT INTO users (name) VALUES ('Taro'), ('Hanako'), ('Jiro');
-- Execute TRUNCATE
TRUNCATE TABLE users;
-- The table is emptied, and AUTO_INCREMENT is reset.
V tomto příkladu jsou všechna data v tabulce odstraněna a při vložení nových dat sloupec id začne znovu od 1.

2. Rozdíly mezi TRUNCATE a DELETE
Rozdíly v rychlosti a výkonu
TRUNCATE je výrazně rychlejší než DELETE, protože je navržen speciálně pro vymazání celých tabulek. DELETE odstraňuje řádky jednotlivě, což může být pomalé při práci s velkým počtem řádků. Na druhou stranu TRUNCATE maže data tím, že interně znovu vytvoří tabulku, což je vysoce efektivní pro hromadné mazání.
Příklad: Porovnání výkonu
Při mazání milionů řádků může příkaz DELETE vypadat takto:
DELETE FROM users WHERE condition;
Naopak TRUNCATE vám umožní smazat všechny řádky:
TRUNCATE TABLE users;
Rozdíl ve výkonu se stává zřetelnějším u velmi velkých tabulek – DELETE může trvat značně dlouho, zatímco TRUNCATE dokončí operaci téměř okamžitě.
Rozdíly v rollbacku
Příkaz TRUNCATE nelze vrátit zpět (rollback). Po jeho provedení jsou data trvale smazána a nelze je obnovit. Naopak DELETE lze vrátit zpět, pokud je použito v rámci transakce, což umožňuje obnovu v případě chyb. To činí DELETE bezpečnějším v některých kontextech.
Rozdíly ve výběrovém mazání
říkaz DELETE může použít klauzuli WHERE k mazání řádků na základě konkrétních podmínek, zatímco TRUNCATE neumožňuje výběrové mazání. Například k odstranění pouze jednoho konkrétního uživatele byste použili DELETE:
DELETE FROM users WHERE id = 1;
Protože TRUNCATE vždy odstraní všechny řádky, DELETE je vhodnější, když potřebujete odstranit jen vybraná data.
3. Vliv TRUNCATE na AUTO_INCREMENT
Reset AUTO_INCREMENT
Když je proveden příkaz TRUNCATE, nejenže jsou odstraněna všechna data v tabulce, ale také se resetuje čítač AUTO_INCREMENT. To znamená, že nová data začnou opět od ID 1. Například pokud po truncacižíte do tabulky users:
INSERT INTO users (name) VALUES ('Ken');
-- id will start again from 1
Ačkoliv může být tento reset užitečný v některých případech, je nutná opatrnost, pokud jsou ID používána jako cizí klíče v jiných tabulkách, protože by to mohlo způsobit neočekávané nesrovnalosti.
4. Opatření při používání TRUNCATE
Data nelze obnovit
Největším rizikem TRUNCATE je, že smazaná data nelze obnovit. Náhodné truncování důležitých dat znamená trvalou ztrátu. Vždy si před provedením TRUNCATE zazálohujte svá data.
Omezení cizích klíčů
použít na tabulky s omezeními cizích klíčů. V takových případech musíte nejprve odstranit omezení nebo řešit související data jiným způsobem.
Požadavky na oprávnění
Pro provedení TRUNCATE musíte mít oprávnění DROP na tabulce. Uživatelé bez dostatečných oprávnění nebudou moci tento příkaz spustit, proto si předem zkontrolujte svá oprávnění.

5. Kdy použít TRUNCATE vs. DELETE
Kdy použít TRUNCATE
TRUNCATE je nejlepší, když potřebujete najednou vyprázdnit celou tabulku. Je zvláště užitečný, když potřebujete rychle odstranit všechny řádky a resetovat AUTO_INCREMENT, například při obnově testovacích dat.
Kdy použít DELETE
DELETE by měl být použit, když potřebujete selektivní odstraňování řádků nebo když je nutné spustit triggery. Je vhodnější, pokud chcete bezpečně odstranit data za určitých podmínek a zároveň zachovat konzistenci databáze.
6. Nejlepší postupy pro bezpečné používání TRUNCATE
Důležitost záloh
Před spuštěním TRUNCATE vždy vytvořte zálohu vašich dat. Ztráta dat v důsledku náhodného spuštění je nevratná, takže v produkčních prostředích je nutná zvýšená opatrnost.
Testování v vývojovém prostředí
Vždy testujte TRUNCATE ve stagingu nebo vývojovém prostředí před jeho použitím v produkci. To zajišťuje, že se chová podle očekávání, a předchází nečekaným problémům.
Správa sloupců AUTO_INCREMENT
Protože TRUNCATE resetuje AUTO_INCREMENT, ověřte, že jedinečné ID a vztahy s ostatními tabulkami nebudou narušeny. Vždy vytvořte zálohu a přezkoumejte závislosti před spuštěním TRUNCATE v kritických systémech.


