Otkrijte kako naredbe TRUNCATE i DELETE funkcionišu u SQL-u, koje su razlike među njima i u kojim situacijama je bolje koristiti jednu umesto druge.
Prilikom rada sa tabelama u bazama podataka, često je potrebno izbrisati određeni broj redova ili sve redove iz tabele. Za brisanje redova iz tabele, možete koristiti SQL naredbe TRUNCATE ili DELETE, u zavisnosti od konkretne potrebe.
U ovom vodiču detaljnije ćemo analizirati svaku od ovih naredbi, objasnićemo kako funkcionišu i kada je preporučljivo koristiti TRUNCATE umesto DELETE, i obrnuto.
Pre nego što nastavimo, korisno je podsetiti se na SQL podskupove:
- Izrazi jezika za definiciju podataka (DDL) se koriste za kreiranje i upravljanje objektima baze podataka, kao što su tabele. SQL naredbe CREATE, DROP i TRUNCATE su primeri DDL naredbi.
- Izrazi jezika za manipulaciju podacima (DML) se koriste za upravljanje podacima unutar objekata baze podataka. DML izrazi se koriste za obavljanje operacija kreiranja, čitanja, ažuriranja i brisanja zapisa.
- Naredbe jezika za upite (DQL) se koriste za preuzimanje podataka iz tabela. Sve SELECT naredbe spadaju u DQL podskup.
Kako se koristi SQL TRUNCATE naredba
Sintaksa SQL TRUNCATE naredbe
Sintaksa za korišćenje SQL TRUNCATE izraza je sledeća:
TRUNCATE TABLE naziv_tabele;
Izvođenje navedene TRUNCATE naredbe briše sve redove iz tabele čije je ime navedeno (naziv_tabele), ali sama tabela ostaje.
Operacija skraćivanja ne skenira sve zapise u tabeli, stoga je prilično brža kada radite sa velikim tabelama.
Primer upotrebe SQL TRUNCATE
📑 Napomena: Ako imate instaliran MySQL na svom računaru, možete da pratite ove korake koristeći MySQL klijent komandne linije. Takođe možete da koristite drugi DBMS po vašem izboru, kao što je PostgreSQL.
Prvo, kreirajmo bazu podataka za rad:
mysql> CREATE DATABASE db1; Query OK, 1 row affected (1.50 sec)
Zatim, izaberite bazu podataka koju smo kreirali:
mysql> use db1; Database changed
Sledeći korak je kreiranje tabele baze podataka. Pokrenite sledeću CREATE TABLE naredbu da biste kreirali tabelu sa zadacima:
-- Kreiranje tabele tasks 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) );
U ovom primeru, tabela zadataka ima sledeće kolone:
- task_id: Jedinstveni identifikator koji se automatski povećava za svaki zadatak.
- title: Naslov ili naziv zadatka, ograničen na 255 karaktera.
- due_date: Rok za zadatak, predstavljen kao datum.
- status: Status zadatka, koji može biti ‘Pending’, ‘In Progress’ ili ‘Completed’. Podrazumevana vrednost je postavljena na ‘Pending’.
- assignee: Osoba zadužena za određeni zadatak.
Sada kada smo kreirali tabelu zadataka, ubacimo neke zapise u nju:
-- Ubacivanje više zapisa u tabelu tasks 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');
Kada izvršite INSERT naredbu, trebalo bi da vidite sličan izlaz:
Query OK, 20 rows affected (0.18 sec) Records: 20 Duplicates: 0 Warnings: 0
Sada pokrenite TRUNCATE naredbu da biste izbrisali sve zapise iz tabele zadataka:
TRUNCATE TABLE tasks; Query OK, 0 rows affected (0.72 sec)
Ovim se uklanjaju svi zapisi, ali ne i sama tabela. To možete proveriti izvršavanjem SHOW TABLES naredbe:
SHOW TABLES;
+---------------+ | Tables_in_db1 | +---------------+ | tasks | +---------------+ 1 row in set (0.00 sec)
SELECT upit za preuzimanje podataka iz tabele zadataka vraća prazan skup:
SELECT * FROM tasks; Empty set (0.00 sec)
Kako se koristi SQL DELETE naredba
Sintaksa SQL DELETE naredbe
Opšta sintaksa za korišćenje SQL DELETE naredbe je sledeća:
DELETE FROM naziv_tabele WHERE uslov;
Uslov u WHERE klauzuli je predikat koji određuje koji redovi treba da se izbrišu. DELETE naredba briše sve redove za koje je predikat TRUE.
Dakle, DELETE naredba vam omogućava veću kontrolu nad tim koji zapisi će biti izbrisani.
Ali, šta se dešava kada koristite DELETE naredbu bez WHERE klauzule?🤔
DELETE FROM naziv_tabele;
Izvršavanje DELETE naredbe na ovaj način briše sve redove iz tabele.
Ako je DELETE naredba ili skup DELETE naredbi deo nepotvrđene transakcije, možete vratiti promene. Međutim, preporučuje se da napravite rezervnu kopiju podataka na drugom mestu.
Primer upotrebe SQL DELETE
Sada da vidimo SQL DELETE naredbu na delu.
Izbrisali smo sve zapise iz tabele zadataka. Dakle, možete ponovo da pokrenete INSERT naredbu (koju smo pokrenuli ranije) da biste ubacili zapise:
-- Ubacivanje više zapisa u tabelu tasks 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');
Prvo, koristimo DELETE naredbu sa WHERE klauzulom. Sledeći upit briše sve redove čiji je status ‘Completed’:
DELETE FROM tasks WHERE status="Completed"; Query OK, 6 rows affected (0.14 sec)
Sada pokrenite ovaj SELECT upit:
SELECT * FROM tasks;
Videćete da trenutno ima 14 redova:
+---------+---------+------------+-------------+----------+ | 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)
Izvršavanjem sledeće DELETE naredbe brišete svih preostalih 14 zapisa u tabeli:
DELETE FROM tasks; Query OK, 14 rows affected (0.20 sec)
Sada je tabela zadataka prazna:
SELECT * FROM tasks; Empty set (0.00 sec)
SQL DROP naredba
Do sada smo naučili:
- TRUNCATE naredba briše sve redove iz tabele.
- DELETE naredba – bez WHERE klauzule – briše sve zapise iz tabele.
Međutim, TRUNCATE i DELETE naredbe ne brišu samu tabelu. Ako želite da obrišete tabelu iz baze podataka, možete koristiti DROP TABLE naredbu:
DROP TABLE naziv_tabele;
Sada, obrišimo tabelu zadataka iz baze podataka:
mysql> DROP TABLE tasks; Query OK, 0 rows affected (0.43 sec)
Videćete da SHOW TABLES naredba vraća prazan skup (pošto smo izbrisali jedinu tabelu koja je bila prisutna u bazi podataka):
mysql> SHOW TABLES; Empty set (0.00 sec)
Kada koristiti TRUNCATE nasuprot DELETE u SQL-u
Karakteristika | TRUNCATE | DELETE |
Sintaksa | TRUNCATE TABLE naziv_tabele; | Sa WHERE klauzulom: DELETE FROM naziv_tabele WHERE uslov; Bez WHERE klauzule: DELETE FROM naziv_tabele; |
SQL podskup | Jezik za definiciju podataka (DDL) | Jezik za manipulaciju podacima (DML) |
Efekat | Briše sve redove u tabeli baze podataka. | Kada se pokrene bez WHERE klauzule, DELETE naredba briše sve zapise iz tabele. |
Performanse | Efikasnija od DELETE naredbe kada se radi sa velikim tabelama. | Manje efikasna od TRUNCATE naredbe. |
Da sumiramo:
- Kada treba da izbrišete sve redove iz velike tabele, koristite TRUNCATE naredbu.
- Da biste izbrisali podskup redova na osnovu određenih uslova, koristite DELETE naredbu.
Rezime
Zaključimo našu diskusiju sa rezimeom:
- Prilikom rada sa bazama podataka, možda ćete želeti da uklonite podskup redova ili sve redove u određenoj tabeli. Za to možete koristiti naredbe TRUNCATE ili DELETE.
- TRUNCATE naredba ima sledeću sintaksu: TRUNCATE TABLE naziv_tabele;. Ona briše sve redove iz tabele navedene sa naziv_tabele, ali ne briše samu tabelu.
- DELETE naredba ima sintaksu: DELETE FROM naziv_tabele WHERE uslov;. Ona uklanja redove za koje je uslov predikata TRUE.
- Izvršavanje SQL DELETE naredbe bez WHERE klauzule briše sve redove u tabeli. Dakle, funkcionalno, ovo postiže isti rezultat kao i SQL TRUNCATE izraz.
- TRUNCATE je posebno brži kada se radi sa većim tabelama, jer ne skenira celu tabelu. Dakle, kada treba da izbrišete sve redove u velikoj tabeli, izvršavanje TRUNCATE naredbe može biti efikasnije.
- Kada treba da izbrišete podskup redova na osnovu određenog uslova, možete koristiti SQL DELETE naredbu.
Za brzi pregled najčešće korišćenih SQL naredbi, pogledajte ovaj SQL cheat sheet.