DELETE i TRUNCATE — oba narzędzia do czyszczenia tabel, ale działają różnie:
Szczegóły:
ROLLBACK), TRUNCATE — nie lub zależy od DBMS.Przykład:
-- Usunąć zamówienia starsze niż 3 lata DELETE FROM orders WHERE created_at < CURRENT_DATE - INTERVAL '3 years'; -- Całkowicie wyczyścić tabelę (szybko) TRUNCATE TABLE logs;
Czy można odzyskać dane po TRUNCATE?
Typowy błąd: sądzą, że tak jak DELETE, TRUNCATE można cofnąć w transakcji. Ale TRUNCATE zazwyczaj nie można cofnąć ani zrobić UNDO, z wyjątkiem niektórych DBMS (na przykład PostgreSQL podczas pracy w obrębie transakcji).
Przykład (w większości DBMS):
BEGIN; TRUNCATE TABLE orders; ROLLBACK; -- W większości DBMS nie zadziała, dane utracone!
Historia
Usunięcie danych tymczasowych w bazie produkcyjnej TRUNCATE zamiast TEST. Trigger audytu usunięcia wierszy zadziałał tylko na DELETE — brak informacji o utraconych danych, czasie i użytkowniku. Utrudniona analiza incydentu.
Historia
Czyszczenie tabeli TRUNCATE przy obecności klucza obcego. SQL wygenerował błąd z powodu ograniczenia integralności referencyjnej, skrypt się nie zakończył, automatyzacja zatrzymała się. Rozwiązanie: tymczasowo usunąć klucze obce lub użyć DELETE.
Historia
Masowe usuwanie danych przez DELETE w dużych tabelach bez batched: z powodu długich blokad baza "zawisła", inne transakcje czekały na zwolnienie blokad. Efekt — awaria systemu. Poprawnie: używać DELETE LIMIT/OFFSET, jeśli jest wspierane, lub batched.