TRUNCATE vs. DELETE în SQL: înțelegerea diferențelor

Aflați cum funcționează instrucțiunile TRUNCATE și DELETE în SQL, diferențele dintre ele și când ar trebui să preferați să utilizați una față de alta.

Când lucrați cu tabele de baze de date, poate fi necesar să ștergeți un subset de rânduri sau toate rândurile. Pentru a șterge rânduri dintr-un tabel de bază de date, puteți utiliza instrucțiunile SQL TRUNCATE sau DELETE în funcție de caz de utilizare.

În acest tutorial, vom arunca o privire mai atentă la fiecare dintre declarații, vom înțelege cum funcționează și vom decide când să preferăm să folosim TRUNCATE decât DELETE și invers.

Înainte de a merge mai departe, este util să revizuim următoarele subseturi SQL:

  • Instrucțiunile DDL (Data Definition Language) sunt folosite pentru a crea și gestiona obiecte de bază de date, cum ar fi tabelele. Instrucțiunile SQL CREATE, DROP și TRUNCATE sunt exemple de instrucțiuni DDL.
  • Instrucțiunile DML (Data Manipulation Language) sunt folosite pentru a manipula datele din obiectele bazei de date. Instrucțiunile DML sunt folosite pentru a efectua operațiuni de creare, citire, actualizare și ștergere a înregistrărilor.
  • Instrucțiunile DQL (Data Query Language) sunt folosite pentru a prelua date din tabelele bazei de date. Toate instrucțiunile SELECT se încadrează în subsetul DQL.

Cum să utilizați instrucțiunea SQL TRUNCATE

Sintaxa instrucțiunii SQL TRUNCATE

Sintaxa de utilizare a instrucțiunii SQL TRUNCATE este următoarea:

TRUNCATE TABLE table_name;

Rularea comenzii TRUNCATE de mai sus șterge toate rândurile din tabelul specificat de table_name — și nu șterge tabelul.

Operația de trunchiere nu scanează toate înregistrările din tabel. Deci, este relativ mai rapid atunci când lucrați cu tabele mari de baze de date.

Exemplu de utilizare SQL TRUNCATE

📑 Notă: Dacă aveți MySQL instalat pe mașina dvs., puteți codifica folosind clientul de linie de comandă MySQL. De asemenea, puteți urmări în alt SGBD la alegere, cum ar fi PostgreSQL.

Mai întâi să creăm o bază de date cu care să lucrăm:

mysql> CREATE DATABASE db1;
Query OK, 1 row affected (1.50 sec)

Apoi selectați baza de date pe care tocmai am creat-o:

mysql> use db1;
Database changed

Următorul pas este crearea unui tabel de bază de date. Rulați următoarea instrucțiune CREATE TABLE pentru a crea un tabel de sarcini simplu:

-- Create the tasks table
CREATE TABLE tasks (
    task_id INT AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(255) NOT NULL,
    due_date DATE,
    status ENUM('Pending', 'In Progress', 'Completed') DEFAULT 'Pending',
    assignee VARCHAR(100)
);

În acest exemplu, tabelul de sarcini are următoarele coloane:

  • task_id: un identificator unic cu creștere automată pentru fiecare sarcină.
  • titlu: titlul sau numele sarcinii, limitat la 255 de caractere.
  • due_date: data scadentă pentru sarcină, reprezentată ca dată.
  • stare: starea sarcinii, care poate fi „În așteptare”, „În curs” sau „Finalizat”. Valoarea implicită este setată la „În așteptare”.
  • assignee: destinatarul pentru sarcina particulară.
  Cum să opriți Safari să lanseze aplicații pe iPhone și iPad

Acum că am creat tabelul de sarcini, să inserăm înregistrări în el:

-- Inserting multiple records into the tasks table
INSERT INTO tasks (title, due_date, status, assignee)
VALUES
    ('Task 1', '2023-08-10', 'Pending', 'John'),
    ('Task 2', '2023-08-11', 'In Progress', 'Jane'),
    ('Task 3', '2023-08-12', 'Completed', 'Mike'),
    ('Task 4', '2023-08-13', 'Pending', 'Alice'),
    ('Task 5', '2023-08-14', 'In Progress', 'Bob'),
    ('Task 6', '2023-08-15', 'Completed', 'Emily'),
    ('Task 7', '2023-08-16', 'Pending', 'David'),
    ('Task 8', '2023-08-17', 'In Progress', 'Olivia'),
    ('Task 9', '2023-08-18', 'Pending', 'Daniel'),
    ('Task 10', '2023-08-19', 'Completed', 'Sophia'),
    ('Task 11', '2023-08-20', 'Pending', 'Matthew'),
    ('Task 12', '2023-08-21', 'In Progress', 'Ava'),
    ('Task 13', '2023-08-22', 'Completed', 'William'),
    ('Task 14', '2023-08-23', 'Pending', 'Ella'),
    ('Task 15', '2023-08-24', 'In Progress', 'James'),
    ('Task 16', '2023-08-25', 'Completed', 'Lily'),
    ('Task 17', '2023-08-26', 'Pending', 'Benjamin'),
    ('Task 18', '2023-08-27', 'In Progress', 'Mia'),
    ('Task 19', '2023-08-28', 'Pending', 'Henry'),
    ('Task 20', '2023-08-29', 'Completed', 'Isabella');

La rularea instrucțiunii insert, ar trebui să vedeți o ieșire similară:

Query OK, 20 rows affected (0.18 sec)
Records: 20  Duplicates: 0  Warnings: 0

Acum rulați comanda TRUNCATE table pentru a șterge toate înregistrările din tabelul de sarcini:

TRUNCATE TABLE tasks;
Query OK, 0 rows affected (0.72 sec)

Procedând astfel, sunt eliminate toate înregistrările și nu tabelul. Puteți verifica acest lucru rulând SHOW TABLES; ca astfel:

SHOW TABLES;
+---------------+
| Tables_in_db1 |
+---------------+
| tasks         |
+---------------+
1 row in set (0.00 sec)

Și o interogare SELECT pentru a prelua date din tabelul de sarcini returnează un set gol:

SELECT * FROM tasks;
Empty set (0.00 sec)

Cum să utilizați instrucțiunea SQL DELETE

Sintaxa instrucțiunii SQL DELETE

Sintaxa generală pentru a utiliza instrucțiunea SQL DELETE este următoarea:

DELETE FROM table_name 
WHERE condition;

Condiția din clauza WHERE este predicatul care determină care dintre rânduri trebuie șters. Instrucțiunea DELETE șterge toate rândurile pentru care predicatul este adevărat.

  Top 10 jocuri metaverse pentru a explora și a te distra

Prin urmare, instrucțiunea DELETE vă permite să aveți mai mult control asupra înregistrărilor care sunt șterse.

Dar ce se întâmplă când folosești instrucțiunea DELETE fără clauza WHERE?🤔

DELETE FROM table_name;

Rularea instrucțiunii DELETE așa cum se arată șterge toate rândurile din tabelul bazei de date.

Dacă o instrucțiune DELETE sau un set de instrucțiuni DELETE fac parte dintr-o tranzacție neangajată, puteți anula modificările. Cu toate acestea, este recomandat să aveți copii de siguranță ale datelor dvs. în altă parte.

Exemplu de utilizare SQL DELETE

Acum să vedem instrucțiunea de ștergere SQL în acțiune.

Am șters toate înregistrările din tabelul de sarcini. Așadar, puteți rula din nou instrucțiunea INSERT (pe care am rulat-o mai devreme) pentru a insera înregistrări:

-- Inserting multiple records into the tasks table
INSERT INTO tasks (title, due_date, status, assignee)
VALUES
    ('Task 1', '2023-08-10', 'Pending', 'John'),
    ('Task 2', '2023-08-11', 'In Progress', 'Jane'),
    ('Task 3', '2023-08-12', 'Completed', 'Mike'),
    ...
    ('Task 18', '2023-08-27', 'In Progress', 'Mia'),
    ('Task 19', '2023-08-28', 'Pending', 'Henry'),
    ('Task 20', '2023-08-29', 'Completed', 'Isabella');

Mai întâi să folosim instrucțiunea DELETE cu clauza WHERE. Următoarea interogare șterge toate rândurile pentru care starea este „Terminat”:

DELETE FROM tasks WHERE status="Completed";
Query OK, 6 rows affected (0.14 sec)

Acum rulați această interogare SELECT:

SELECT * FROM tasks;

Veți vedea că în prezent există 14 rânduri:

+---------+---------+------------+-------------+----------+
| task_id | title   | due_date   | status      | assignee |
+---------+---------+------------+-------------+----------+
|       1 | Task 1  | 2023-08-10 | Pending     | John     |
|       2 | Task 2  | 2023-08-11 | In Progress | Jane     |
|       4 | Task 4  | 2023-08-13 | Pending     | Alice    |
|       5 | Task 5  | 2023-08-14 | In Progress | Bob      |
|       7 | Task 7  | 2023-08-16 | Pending     | David    |
|       8 | Task 8  | 2023-08-17 | In Progress | Olivia   |
|       9 | Task 9  | 2023-08-18 | Pending     | Daniel   |
|      11 | Task 11 | 2023-08-20 | Pending     | Matthew  |
|      12 | Task 12 | 2023-08-21 | In Progress | Ava      |
|      14 | Task 14 | 2023-08-23 | Pending     | Ella     |
|      15 | Task 15 | 2023-08-24 | In Progress | James    |
|      17 | Task 17 | 2023-08-26 | Pending     | Benjamin |
|      18 | Task 18 | 2023-08-27 | In Progress | Mia      |
|      19 | Task 19 | 2023-08-28 | Pending     | Henry    |
+---------+---------+------------+-------------+----------+
14 rows in set (0.00 sec)

Rularea următoarei instrucțiuni DELETE șterge toate cele 14 înregistrări rămase din tabel:

DELETE FROM tasks;
Query OK, 14 rows affected (0.20 sec)

Și tabelul de sarcini este acum gol:

SELECT * FROM tasks;
Empty set (0.00 sec)

Declarația SQL DROP

Până acum, am învățat:

  • Instrucțiunea TRUNCATE șterge toate rândurile din tabel.
  • Instrucțiunea DELETE — fără o clauză WHERE — șterge toate înregistrările din tabel.
  PC-ul se pornește și se oprește în mod repetat, dar nu se afișează

Cu toate acestea, instrucțiunile TRUNCATE și DELETE nu șterg tabelul. Dacă doriți să ștergeți tabelul din baza de date, puteți utiliza comanda DROP TABLE astfel:

DROP TABLE table_name;

Acum să ștergem tabelul de sarcini din baza de date:

mysql> DROP TABLE tasks;
Query OK, 0 rows affected (0.43 sec)

Veți vedea că SHOW TABLES; returnează un set gol (deoarece am șters singurul tabel care era prezent în baza de date):

mysql> SHOW TABLES;
Empty set (0.00 sec)

Când să utilizați TRUNCATE vs. DELETE în SQL

CaracteristicăTRUNCATEDELETESyntaxTRUNCATE TABLE table_name;Cu clauza WHERE: DELETE FROM table_name condiție WHERE;
Fără clauza WHERE: DELETE TABLE table_name;SQL SubsetData definition language (DDL)Data manipulation language (DML)EfectSterge toate rândurile din tabelul bazei de date. Când rulează fără clauza WHERE, instrucțiunea DELETE șterge toate înregistrările din tabelul bazei de date.PerformanțăMai mult eficient decât instrucțiunea DELETE atunci când se lucrează cu tabele mari.Mai puțin eficient decât instrucțiunea TRUNCATE.

În concluzie:

  • Când trebuie să ștergeți toate rândurile dintr-un tabel mare de bază de date, utilizați instrucțiunea TRUNCATE.
  • Pentru a șterge un subset de rânduri pe baza unor condiții specifice, utilizați instrucțiunea DELETE.

Rezumând

Să încheiem discuția noastră cu un rezumat:

  • Când lucrați cu tabele de baze de date, este posibil să doriți să eliminați subsetul de rânduri sau toate rândurile dintr-un anumit tabel. Pentru a face acest lucru, puteți utiliza instrucțiunile TRUNCATE sau DELETE.
  • Instrucțiunea TRUNCATE are sintaxa: TRUNCATE TABLE nume_tabelă;. Acesta șterge toate rândurile din tabelul specificat de table_name, dar nu șterge tabelul în sine.
  • Instrucțiunea DELETE are sintaxa: DELETE FROM table_name WHERE condiție;. Aceasta elimină rândurile pentru care condiția predicat este adevărată.
  • Rularea instrucțiunii SQL DELETE fără clauza WHERE șterge toate rândurile din tabel. Deci, din punct de vedere funcțional, aceasta obține același rezultat ca instrucțiunea SQL TRUNCATE.
  • Rularea TRUNCATE este mai ales mai rapidă atunci când lucrați cu tabele mai mari, deoarece nu scanează întregul tabel. Deci, atunci când trebuie să ștergeți toate rândurile dintr-un tabel mare de bază de date, rularea truncate poate fi mai eficientă.
  • Când trebuie să ștergeți un subset de rânduri, pe baza unei anumite condiții, puteți utiliza instrucțiunea SQL DELETE.

Pentru o trecere în revistă rapidă a comenzilor SQL utilizate în mod obișnuit, consultați această foaie de cheat SQL.