Poprawnie – TRUNCATE TABLE w MySQL służy do usuwania wszystkich wierszy z tabeli, a nie samej tabeli. Technicznie jest to polecenie DDL (Data Definition Language), chociaż z punktu widzenia efektu końcowego zachowuje się „podobnie” do bardzo szybkiego DELETE bez klauzuli WHERE. Różnica jest jednak istotna. TRUNCATE TABLE usuwa wszystkie rekordy naraz, zwykle poprzez opróżnienie całych segmentów danych, dzięki czemu jest znacznie szybsze niż klasyczne DELETE FROM tabela, które kasuje każdy wiersz osobno i loguje każdą operację. W MySQL po TRUNCATE bardzo często licznik AUTO_INCREMENT resetuje się do wartości początkowej, co w praktyce oznacza, że nowe rekordy dostaną takie same ID, jak kiedyś istniały. To jest ważne np. w środowisku testowym, gdy chcesz „wyczyścić” tabelę i zacząć od zera. W środowisku produkcyjnym trzeba uważać, bo po TRUNCATE nie da się przywrócić danych zwykłym ROLLBACK (w większości silników MySQL, np. InnoDB, traktowane jest to jak operacja DDL i commitowana jest natychmiast). Moim zdaniem TRUNCATE najlepiej używać wtedy, gdy mamy tabelę pomocniczą, logi, cache albo dane tymczasowe, które można bezpiecznie wyrzucić w całości i nie potrzebujemy historii zmian. Dobrą praktyką jest też upewnienie się, że na tabeli nie ma powiązań przez klucze obce, bo w MySQL TRUNCATE na tabeli referencjonowanej przez FOREIGN KEY może się nie udać albo wymagać wcześniejszego wyłączenia ograniczeń referencyjnych. W skrócie: TRUNCATE TABLE to narzędzie do szybkiego, hurtowego kasowania wszystkich wierszy tabeli, z zachowaniem samej struktury tej tabeli (kolumny, indeksy, definicje kluczy zostają).
W poleceniu TRUNCATE TABLE kluczowe jest zrozumienie, że operujemy na zawartości tabeli, a nie na jej definicji czy całej bazie danych. W praktyce wiele osób myli to polecenie z innymi instrukcjami SQL, co później prowadzi do niebezpiecznych sytuacji w środowisku produkcyjnym. Usuwanie tabel jako obiektów bazy danych realizuje się poleceniem DROP TABLE. DROP kasuje całą strukturę: kolumny, indeksy, klucze, uprawnienia powiązane z tą tabelą. Po DROP nie ma już gdzie wstawić danych, trzeba tabelę zdefiniować na nowo. TRUNCATE takich rzeczy nie robi, pozostawia strukturę nienaruszoną. Mylenie TRUNCATE z usuwaniem kolumn też bywa częste. Za dodawanie i usuwanie kolumn odpowiada ALTER TABLE, np. ALTER TABLE nazwa_tabeli DROP COLUMN nazwa_kolumny. To są operacje na schemacie (strukturze) danych, a TRUNCATE działa na poziomie rekordów, czyli zawartości. Ktoś, kto kojarzy słowo „truncate” z „ucięciem” struktury, może intuicyjnie pomyśleć, że zniknie kolumna, ale w SQL tak to nie działa. Podobnie w przypadku baz danych: do kasowania całych baz służy DROP DATABASE, ewentualnie w narzędziach typu phpMyAdmin odpowiednie opcje w interfejsie. TRUNCATE TABLE nie ma prawa dotykać całej bazy, bo jest przypisane do konkretnej tabeli. Typowy błąd myślowy polega na wrzuceniu do jednego worka wszystkich poleceń, które „coś usuwają”, bez rozróżniania, czy modyfikujemy strukturę (DDL), czy dane (DML), oraz na jakim poziomie: pojedynczy rekord, wszystkie rekordy, tabela czy cała baza. W MySQL TRUNCATE to specyficzna hybryda – formalnie DDL, ale semantycznie kasuje wyłącznie wiersze. Dlatego dobra praktyka jest taka: DROP używamy, gdy chcemy pozbyć się obiektu (tabeli, bazy), ALTER – gdy zmieniamy strukturę (kolumny, indeksy), a TRUNCATE lub DELETE – gdy czyścimy zawartość, przy czym TRUNCATE zawsze usuwa wszystkie wiersze, bez możliwości filtrowania i bez prostego cofnięcia transakcji. Rozdzielenie tych pojęć bardzo ułatwia bezpieczną pracę z SQL-em.