1. Mis on TRUNCATE-käsk
TRUNCATE-käsu põhimõisted
MySQL-i TRUNCATE-käsk on käsk, mis kustutab korraga kõik andmed tabelist. Erinevalt DELETE-käsust, mis kustutab ridu ükshaaval, loob TRUNCATE tabeli sisemiselt uuesti, et andmed eemaldada. Seetõttu on see väga tõhus suurte andmehulkade kustutamisel.
Põhisüntaks
TRUNCATE-käsu põhisüntaks on järgmine:
TRUNCATE TABLE tabeli_nimi;
Selle käsuga kustutatakse kõik read määratud tabelist ning tabel taastatakse algsesse olekusse. Kuid kustutatud andmeid ei saa taastada, seega tuleb kasutada ettevaatlikult.
Näide: põhiline kasutus
Allolevas näites luuakse tabel users
ning seejärel kustutatakse kõik andmed TRUNCATE-käsuga.
CREATE TABLE users (
id INT AUTO_INCREMENT,
name VARCHAR(100),
PRIMARY KEY (id)
);
INSERT INTO users (name) VALUES ('Taro'), ('Hanako'), ('Jiro');
-- Käivita TRUNCATE
TRUNCATE TABLE users;
-- Tabel on tühi ja AUTO_INCREMENT lähtestatakse.
Selles näites kustutatakse kõik andmed tabelist ning järgmine sisestus alustab id
väärtust jälle 1-st.

2. TRUNCATE ja DELETE erinevused
Kiirus ja jõudlus
TRUNCATE on oluliselt kiirem kui DELETE, sest see on loodud terve tabeli korraga tühjendamiseks. DELETE kustutab read ükshaaval ja seetõttu võib suurte andmehulkade puhul aeglasem olla. TRUNCATE aga loob tabeli uuesti ning kustutab andmed hetkega.
Näide: jõudluse võrdlus
Kui kustutada miljoneid ridu, näeb DELETE-käsk välja järgmine:
DELETE FROM users WHERE tingimus;
TRUNCATE puhul saab kõik read korraga kustutada nii:
TRUNCATE TABLE users;
Suurte tabelite puhul on erinevus selgelt märgatav – DELETE võib võtta kaua aega, samas kui TRUNCATE lõpetab peaaegu kohe.
Tagasipööramise (rollback) erinevus
TRUNCATE-käsku ei saa tagasi pöörata. Kui see on käivitatud, eemaldatakse andmed lõplikult. DELETE-käsku aga saab kasutada transaktsioonis ning vigade korral on võimalik tagasipööramine (rollback). See on oluline erinevus turvalisuse seisukohalt.
Valikuline kustutamine
DELETE võimaldab kasutada WHERE
-tingimust, et kustutada ainult teatud read. TRUNCATE seda ei võimalda. Näiteks konkreetse kasutaja kustutamiseks tuleb kasutada DELETE:
DELETE FROM users WHERE id = 1;
Kuna TRUNCATE kustutab kõik read, on see sobimatu juhul, kui vaja on eemaldada vaid osa andmetest.
3. TRUNCATE mõju AUTO_INCREMENT väärtusele
AUTO_INCREMENT lähtestamine
TRUNCATE lähtestab ka AUTO_INCREMENT väärtuse. See tähendab, et uute andmete lisamisel hakkab ID jälle väärtusest 1. Näiteks:
INSERT INTO users (name) VALUES ('Ken');
-- id algab jälle 1-st
See võib olla kasulik, kuid kui ID-sid kasutatakse välisvõtmetena teistes tabelites, võib see põhjustada ootamatuid andmete vastuolusid.
4. Olulised ettevaatusabinõud TRUNCATE kasutamisel
Andmete taastamise võimatus
TRUNCATE suurim risk on see, et kustutatud andmeid ei saa taastada. Enne käivitamist tuleks kindlasti teha andmete varukoopia.
Välisvõtmete piirang
TRUNCATE ei tööta tabelitel, millel on välisvõtme piirangud. Sel juhul tuleb esmalt piirangud eemaldada või kasutada muid meetodeid.
Käivitamisõiguste piirang
TRUNCATE käivitamiseks on vaja DROP-õigust. Kui kasutajal seda õigust pole, ei saa käsku käivitada. Seetõttu tuleks enne õigused üle kontrollida.

5. Millal kasutada TRUNCATE ja millal DELETE
TRUNCATE sobib
TRUNCATE sobib olukordades, kus on vaja kiiresti kogu tabel tühjendada. Näiteks testandmete lähtestamisel või juhul, kui AUTO_INCREMENT tuleb uuesti alustada.
DELETE sobib
DELETE on parem valik, kui on vaja kustutada ainult teatud read või kui käivituvad trigereid. DELETE tagab suurema kontrolli ja turvalisuse.
6. Parimad tavad TRUNCATE kasutamisel
Varukoopiate tähtsus
Enne TRUNCATE käivitamist tee kindlasti andmete varukoopia. Andmete kadumist ei saa tagasi pöörata.
Testkeskkonnas kontrollimine
Soovitatav on TRUNCATE esmalt proovida testkeskkonnas. Nii saab veenduda, et see töötab oodatud viisil.
AUTO_INCREMENT haldamine
Kuna TRUNCATE lähtestab AUTO_INCREMENT väärtuse, tuleb enne kasutamist kontrollida, kas see ei riku seoseid teiste tabelitega.