MySQL TRUNCATE käsk: kiire viis tabeli tühjendamiseks võrreldes DELETE-ga

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.