Descoperă modul în care funcționează comenzile TRUNCATE și DELETE în SQL, diferențele dintre ele și în ce situații este mai indicat să folosești una în detrimentul celeilalte.
În activitatea cu tabele de baze de date, uneori este necesară ștergerea anumitor rânduri sau a tuturor. Pentru a realiza acest lucru, poți utiliza comenzile SQL TRUNCATE sau DELETE, în funcție de cerințele specifice.
În acest material, vom analiza în detaliu fiecare comandă, vom înțelege funcționarea lor și vom decide când este preferabil să folosim TRUNCATE în locul DELETE și invers.
Înainte de a continua, este util să revedem următoarele categorii SQL:
- Comenzile DDL (Data Definition Language) sunt folosite pentru a crea și administra structuri de baze de date, precum tabelele. Exemple de comenzi DDL sunt CREATE, DROP și TRUNCATE.
- Comenzile DML (Data Manipulation Language) se utilizează pentru a manipula datele din obiectele bazelor de date. Aceste comenzi sunt folosite pentru a crea, citi, actualiza și șterge înregistrări.
- Comenzile DQL (Data Query Language) sunt utilizate pentru a extrage date din tabelele bazelor de date. Toate comenzile SELECT fac parte din categoria DQL.
Cum se utilizează comanda SQL TRUNCATE
Sintaxa comenzii SQL TRUNCATE
Sintaxa comenzii SQL TRUNCATE este următoarea:
TRUNCATE TABLE nume_tabel;
Executarea comenzii TRUNCATE, prezentată mai sus, va elimina toate rândurile din tabelul specificat prin `nume_tabel` — fără a șterge tabelul în sine.
Operația de trunchiere nu necesită scanarea fiecărei înregistrări din tabel. Drept urmare, este o operație rapidă, în special când este vorba de tabele de baze de date voluminoase.
Exemplu de utilizare a comenzii SQL TRUNCATE
📑 Notă: Dacă ai MySQL instalat pe calculatorul tău, poți scrie cod folosind clientul de linie de comandă MySQL. Poți de asemenea să urmărești exemplul folosind un alt sistem de gestiune a bazelor de date, ca de exemplu PostgreSQL.
Începem prin a crea o bază de date cu care să lucrăm:
mysql> CREATE DATABASE bd1; Query OK, 1 rând afectat (1.50 sec)
Apoi selectăm baza de date pe care tocmai am creat-o:
mysql> use bd1; Baza de date schimbată
Următorul pas este crearea unui tabel în baza de date. Executează următoarea comandă CREATE TABLE pentru a crea un tabel simplu de sarcini:
-- Crearea tabelului sarcini CREATE TABLE sarcini ( id_sarcina INT AUTO_INCREMENT PRIMARY KEY, titlu VARCHAR(255) NOT NULL, data_limita DATE, status ENUM('In asteptare', 'In lucru', 'Finalizat') DEFAULT 'In asteptare', responsabil VARCHAR(100) );
În acest exemplu, tabelul de sarcini are următoarele coloane:
- `id_sarcina`: un identificator unic cu creștere automată pentru fiecare sarcină.
- `titlu`: denumirea sau descrierea sarcinii, limitată la 255 de caractere.
- `data_limita`: data la care sarcina trebuie finalizată, reprezentată ca dată.
- `status`: starea sarcinii, care poate fi „În așteptare”, „În lucru” sau „Finalizat”. Valoarea implicită este setată la „În așteptare”.
- `responsabil`: persoana desemnată pentru sarcina respectivă.
Acum că am creat tabelul de sarcini, să inserăm câteva înregistrări în el:
-- Inserarea mai multor înregistrări în tabelul sarcini INSERT INTO sarcini (titlu, data_limita, status, responsabil) VALUES ('Sarcina 1', '2023-08-10', 'In asteptare', 'Ion'), ('Sarcina 2', '2023-08-11', 'In lucru', 'Ana'), ('Sarcina 3', '2023-08-12', 'Finalizat', 'Mihai'), ('Sarcina 4', '2023-08-13', 'In asteptare', 'Alina'), ('Sarcina 5', '2023-08-14', 'In lucru', 'Bogdan'), ('Sarcina 6', '2023-08-15', 'Finalizat', 'Emilia'), ('Sarcina 7', '2023-08-16', 'In asteptare', 'David'), ('Sarcina 8', '2023-08-17', 'In lucru', 'Olivia'), ('Sarcina 9', '2023-08-18', 'In asteptare', 'Daniel'), ('Sarcina 10', '2023-08-19', 'Finalizat', 'Sofia'), ('Sarcina 11', '2023-08-20', 'In asteptare', 'Matei'), ('Sarcina 12', '2023-08-21', 'In lucru', 'Eva'), ('Sarcina 13', '2023-08-22', 'Finalizat', 'William'), ('Sarcina 14', '2023-08-23', 'In asteptare', 'Ella'), ('Sarcina 15', '2023-08-24', 'In lucru', 'James'), ('Sarcina 16', '2023-08-25', 'Finalizat', 'Lily'), ('Sarcina 17', '2023-08-26', 'In asteptare', 'Benjamin'), ('Sarcina 18', '2023-08-27', 'In lucru', 'Mia'), ('Sarcina 19', '2023-08-28', 'In asteptare', 'Henry'), ('Sarcina 20', '2023-08-29', 'Finalizat', 'Isabella');
După executarea comenzii `insert`, ar trebui să vezi un rezultat similar:
Query OK, 20 rânduri afectate (0.18 sec) Înregistrări: 20 Duplicat: 0 Avertismente: 0
Acum execută comanda `TRUNCATE TABLE` pentru a șterge toate înregistrările din tabelul `sarcini`:
TRUNCATE TABLE sarcini; Query OK, 0 rânduri afectate (0.72 sec)
În urma acestei operații, toate înregistrările sunt eliminate, dar tabelul rămâne. Poți verifica acest lucru executând `SHOW TABLES;`, astfel:
SHOW TABLES;
+---------------+ | Tabele_in_bd1 | +---------------+ | sarcini | +---------------+ 1 rând în set (0.00 sec)
Și o interogare `SELECT` pentru a prelua date din tabelul `sarcini` va returna un set gol:
SELECT * FROM sarcini; Set gol (0.00 sec)
Cum se utilizează comanda SQL DELETE
Sintaxa comenzii SQL DELETE
Sintaxa generală pentru a utiliza comanda SQL DELETE este următoarea:
DELETE FROM nume_tabel WHERE condiție;
Condiția din clauza `WHERE` este criteriul care determină ce rânduri trebuie șterse. Comanda `DELETE` șterge toate rândurile pentru care condiția este adevărată.
Așadar, comanda `DELETE` îți oferă un control mai mare asupra înregistrărilor care sunt șterse.
Dar ce se întâmplă dacă folosim comanda `DELETE` fără clauza `WHERE`?🤔
DELETE FROM nume_tabel;
Executarea comenzii `DELETE` așa cum este prezentată va șterge toate rândurile din tabelul bazei de date.
Dacă o comandă `DELETE` sau un set de comenzi `DELETE` fac parte dintr-o tranzacție nefinalizată, poți anula modificările. Cu toate acestea, este recomandat să ai copii de rezervă ale datelor tale stocate în altă parte.
Exemplu de utilizare a comenzii SQL DELETE
Acum să vedem comanda `DELETE` SQL în acțiune.
Am șters toate înregistrările din tabelul `sarcini`. Prin urmare, poți executa din nou comanda `INSERT` (pe care am rulat-o mai devreme) pentru a insera înregistrări:
-- Inserarea mai multor înregistrări în tabelul sarcini INSERT INTO sarcini (titlu, data_limita, status, responsabil) VALUES ('Sarcina 1', '2023-08-10', 'In asteptare', 'Ion'), ('Sarcina 2', '2023-08-11', 'In lucru', 'Ana'), ('Sarcina 3', '2023-08-12', 'Finalizat', 'Mihai'), ... ('Sarcina 18', '2023-08-27', 'In lucru', 'Mia'), ('Sarcina 19', '2023-08-28', 'In asteptare', 'Henry'), ('Sarcina 20', '2023-08-29', 'Finalizat', 'Isabella');
Mai întâi vom folosi comanda `DELETE` cu clauza `WHERE`. Următoarea interogare șterge toate rândurile pentru care starea este „Finalizat”:
DELETE FROM sarcini WHERE status="Finalizat"; Query OK, 6 rânduri afectate (0.14 sec)
Acum execută această interogare `SELECT`:
SELECT * FROM sarcini;
Vei vedea că în prezent există 14 rânduri:
+------------+-----------+------------+-------------+------------+ | id_sarcina | titlu | data_limita | status | responsabil | +------------+-----------+------------+-------------+------------+ | 1 | Sarcina 1 | 2023-08-10 | In asteptare | Ion | | 2 | Sarcina 2 | 2023-08-11 | In lucru | Ana | | 4 | Sarcina 4 | 2023-08-13 | In asteptare | Alina | | 5 | Sarcina 5 | 2023-08-14 | In lucru | Bogdan | | 7 | Sarcina 7 | 2023-08-16 | In asteptare | David | | 8 | Sarcina 8 | 2023-08-17 | In lucru | Olivia | | 9 | Sarcina 9 | 2023-08-18 | In asteptare | Daniel | | 11 | Sarcina 11| 2023-08-20 | In asteptare | Matei | | 12 | Sarcina 12| 2023-08-21 | In lucru | Eva | | 14 | Sarcina 14| 2023-08-23 | In asteptare | Ella | | 15 | Sarcina 15| 2023-08-24 | In lucru | James | | 17 | Sarcina 17| 2023-08-26 | In asteptare | Benjamin | | 18 | Sarcina 18| 2023-08-27 | In lucru | Mia | | 19 | Sarcina 19| 2023-08-28 | In asteptare | Henry | +------------+-----------+------------+-------------+------------+ 14 rânduri în set (0.00 sec)
Executarea următoarei comenzi `DELETE` șterge toate cele 14 înregistrări rămase din tabel:
DELETE FROM sarcini; Query OK, 14 rânduri afectate (0.20 sec)
Și tabelul `sarcini` este acum gol:
SELECT * FROM sarcini; Set gol (0.00 sec)
Comanda SQL DROP
Până acum, am învățat că:
- Comanda `TRUNCATE` șterge toate rândurile dintr-un tabel.
- Comanda `DELETE` — fără clauza `WHERE` — șterge toate înregistrările din tabel.
Cu toate acestea, nici comenzile `TRUNCATE`, nici `DELETE` nu șterg tabelul. Dacă dorești să ștergi tabelul din baza de date, poți utiliza comanda `DROP TABLE`, astfel:
DROP TABLE nume_tabel;
Acum, să ștergem tabelul `sarcini` din baza de date:
mysql> DROP TABLE sarcini; Query OK, 0 rânduri afectate (0.43 sec)
Vei observa că `SHOW TABLES;` returnează un set gol (deoarece am șters singurul tabel care era prezent în baza de date):
mysql> SHOW TABLES; Set gol (0.00 sec)
Când se utilizează TRUNCATE vs. DELETE în SQL
Caracteristică | TRUNCATE | DELETE |
Sintaxă | TRUNCATE TABLE nume_tabel; | Cu clauza `WHERE`: DELETE FROM nume_tabel WHERE condiție; Fără clauza `WHERE`: DELETE TABLE nume_tabel; |
Categoria SQL | Limbaj de definire a datelor (DDL) | Limbaj de manipulare a datelor (DML) |
Efect | Șterge toate rândurile din tabelul bazei de date. | Când rulează fără clauza `WHERE`, comanda DELETE șterge toate înregistrările din tabelul bazei de date. |
Performanță | Mai eficientă decât comanda `DELETE` atunci când se lucrează cu tabele mari. | Mai puțin eficientă decât comanda `TRUNCATE`. |
În concluzie:
- Când trebuie să ștergi toate rândurile dintr-un tabel mare de date, folosește comanda `TRUNCATE`.
- Pentru a șterge un grup de rânduri pe baza unor condiții specifice, folosește comanda `DELETE`.
Rezumat
Să încheiem discuția cu un rezumat:
- Atunci când lucrezi cu tabele de baze de date, poate fi necesară eliminarea unui grup de rânduri sau a tuturor rândurilor dintr-un anumit tabel. Pentru a realiza acest lucru, poți utiliza comenzile `TRUNCATE` sau `DELETE`.
- Comanda `TRUNCATE` are sintaxa: `TRUNCATE TABLE nume_tabel;`. Aceasta șterge toate rândurile din tabelul specificat de `nume_tabel`, dar nu șterge tabelul propriu-zis.
- Comanda `DELETE` are sintaxa: `DELETE FROM nume_tabel WHERE condiție;`. Aceasta elimină rândurile pentru care condiția dată este adevărată.
- Executarea comenzii SQL `DELETE` fără clauza `WHERE` șterge toate rândurile din tabel. Așadar, din punct de vedere funcțional, are același rezultat ca și comanda SQL `TRUNCATE`.
- Executarea `TRUNCATE` este în general mai rapidă când lucrezi cu tabele mari, deoarece nu scanează întregul tabel. Astfel, când trebuie să ștergi toate rândurile dintr-un tabel mare, `truncate` poate fi mai eficientă.
- Când trebuie să ștergi un subset de rânduri, în funcție de o anumită condiție, poți folosi comanda SQL `DELETE`.
Pentru o privire rapidă asupra comenzilor SQL utilizate în mod frecvent, consultă această fișă cu comenzi SQL.