Ponořte se do světa SQL a zjistěte, jak se liší příkazy TRUNCATE a DELETE. Porozumějte jejich funkcím a naučte se, kdy je nejvhodnější použít jeden z nich.
Při manipulaci s databázovými tabulkami se často setkáte s potřebou smazat buď vybrané, nebo úplně všechny řádky. V závislosti na vašem konkrétním cíli můžete k odstranění dat použít SQL příkazy TRUNCATE nebo DELETE.
V tomto článku se podrobně podíváme na oba příkazy, abychom pochopili jejich mechanismy a rozhodli se, kdy je výhodnější použít TRUNCATE namísto DELETE a naopak.
Než se pustíme do detailů, je užitečné připomenout si několik základních kategorií SQL příkazů:
- Příkazy DDL (Data Definition Language) se používají k definování a správě struktury databáze, například k vytváření tabulek. Mezi DDL příkazy patří CREATE, DROP a TRUNCATE.
- Příkazy DML (Data Manipulation Language) se používají k manipulaci se samotnými daty uvnitř tabulek. DML příkazy se používají k vkládání, čtení, aktualizaci a mazání datových záznamů.
- Příkazy DQL (Data Query Language) slouží k získávání informací z databáze. Hlavním zástupcem DQL je příkaz SELECT.
Použití příkazu SQL TRUNCATE
Syntaxe příkazu TRUNCATE
Základní syntaxe příkazu TRUNCATE v SQL vypadá takto:
TRUNCATE TABLE nazev_tabulky;
Tímto příkazem odstraníte všechny řádky z tabulky, kterou specifikujete pomocí parametru `nazev_tabulky`. Tabulka samotná však zůstane zachována.
Příkaz TRUNCATE nepřistupuje k jednotlivým záznamům v tabulce, což mu umožňuje pracovat efektivněji, obzvláště s rozsáhlými tabulkami.
Příklad použití TRUNCATE
📝 Poznámka: Pokud máte MySQL na svém počítači, můžete si kódování vyzkoušet pomocí příkazového řádku MySQL. Alternativně, můžete použít PostgreSQL nebo jiný databázový systém.
Nejprve si vytvoříme databázi pro naše experimenty:
mysql> CREATE DATABASE db1; Query OK, 1 row affected (1.50 sec)
Dále vybereme právě vytvořenou databázi:
mysql> use db1; Database changed
Následující krok spočívá ve vytvoření tabulky. Následujícím příkazem CREATE TABLE vytvoříme tabulku `tasks` pro seznam úkolů:
-- 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) );
V tabulce `tasks` máme tyto sloupce:
- `task_id`: Jednoznačný identifikátor úkolu, který se automaticky zvyšuje.
- `title`: Název úkolu, maximálně 255 znaků.
- `due_date`: Termín dokončení úkolu.
- `status`: Aktuální stav úkolu (čekající, probíhá, dokončeno), s výchozí hodnotou „Pending“.
- `assignee`: Osoba, které je úkol přidělen.
Po vytvoření tabulky do ní můžeme vložit data:
-- 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');
Po provedení příkazu insert uvidíte výstup podobný tomuto:
Query OK, 20 rows affected (0.18 sec) Records: 20 Duplicates: 0 Warnings: 0
Nyní použijeme příkaz TRUNCATE pro odstranění všech záznamů z tabulky úkolů:
TRUNCATE TABLE tasks; Query OK, 0 rows affected (0.72 sec)
Všechny záznamy byly smazány, tabulka však stále existuje. Můžete si to ověřit příkazem `SHOW TABLES;`:
SHOW TABLES;
+---------------+ | Tables_in_db1 | +---------------+ | tasks | +---------------+ 1 row in set (0.00 sec)
A dotaz SELECT vrácí prázdnou množinu:
SELECT * FROM tasks; Empty set (0.00 sec)
Použití příkazu SQL DELETE
Syntaxe příkazu DELETE
Obecná syntaxe příkazu DELETE v SQL vypadá takto:
DELETE FROM nazev_tabulky WHERE podminka;
Klauzule `WHERE` umožňuje specifikovat podmínku, na základě které se záznamy mají smazat. Příkaz DELETE smaže všechny řádky, které splňují tuto podmínku.
Příkaz DELETE tedy nabízí detailnější kontrolu nad tím, které záznamy budou smazány.
Co se stane, pokud použijeme příkaz DELETE bez klauzule WHERE? 🤔
DELETE FROM nazev_tabulky;
Použitím tohoto příkazu se smažou všechny záznamy z tabulky.
Pokud je příkaz DELETE součástí neuzavřené transakce, je možné změny vrátit. Každopádně doporučujeme data mít zálohovaná.
Příklad použití DELETE
Pojďme si ukázat příkaz DELETE v akci.
Všechny záznamy z tabulky úkolů jsme smazali. Můžeme tedy znovu vložit záznamy pomocí příkazu INSERT (který jsme použili dříve):
-- 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');
Nejprve použijeme příkaz DELETE s klauzulí WHERE. Následující příkaz odstraní všechny úkoly se stavem „Completed“:
DELETE FROM tasks WHERE status="Completed"; Query OK, 6 rows affected (0.14 sec)
Nyní spusťte dotaz SELECT:
SELECT * FROM tasks;
Zobrazí se 14 zbývajících záznamů:
+---------+---------+------------+-------------+----------+ | 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)
Použitím následujícího příkazu DELETE smažeme zbylých 14 záznamů:
DELETE FROM tasks; Query OK, 14 rows affected (0.20 sec)
A tabulka úkolů je opět prázdná:
SELECT * FROM tasks; Empty set (0.00 sec)
Příkaz SQL DROP
Zatím jsme se naučili, že:
- TRUNCATE odstraní všechny řádky z tabulky.
- DELETE bez klauzule WHERE smaže všechny záznamy z tabulky.
Ani TRUNCATE, ani DELETE ale tabulku neodstraní. Chcete-li tabulku odstranit z databáze, použijte příkaz DROP TABLE:
DROP TABLE nazev_tabulky;
Nyní tedy odstraníme tabulku `tasks` z databáze:
mysql> DROP TABLE tasks; Query OK, 0 rows affected (0.43 sec)
Příkaz SHOW TABLES teď vrátí prázdnou množinu (protože jsme smazali jedinou tabulku v databázi):
mysql> SHOW TABLES; Empty set (0.00 sec)
Kdy použít TRUNCATE vs. DELETE?
Funkce | TRUNCATE | DELETE |
Syntaxe | TRUNCATE TABLE nazev_tabulky; |
S klauzulí WHERE: DELETE FROM nazev_tabulky WHERE podminka; Bez klauzule WHERE: DELETE TABLE nazev_tabulky; |
SQL Podmnožina | Data Definition Language (DDL) | Data Manipulation Language (DML) |
Efekt | Odstraní všechny řádky v tabulce. | Bez WHERE odstraní všechny záznamy v tabulce. |
Výkon | Efektivnější u větších tabulek. | Méně efektivní než TRUNCATE. |
Shrnutí:
- Použijte příkaz TRUNCATE, pokud potřebujete odstranit všechny řádky z velké tabulky.
- Použijte příkaz DELETE, pokud potřebujete smazat jen některé řádky na základě specifických podmínek.
Závěrem
Pojďme si zrekapitulovat, co jsme se naučili:
- Při práci s databázovými tabulkami je potřeba občas odstranit specifické, nebo všechny řádky. K tomu lze použít TRUNCATE nebo DELETE.
- Příkaz TRUNCATE má syntaxi: `TRUNCATE TABLE nazev_tabulky;`. Odstraní všechny řádky z tabulky, ale samotnou tabulku nechá.
- Příkaz DELETE má syntaxi: `DELETE FROM nazev_tabulky WHERE podminka;`. Smaže všechny řádky, které splňují danou podmínku.
- Příkaz `DELETE FROM nazev_tabulky;` bez klauzule WHERE odstraní všechny řádky z tabulky. Stejně jako TRUNCATE.
- TRUNCATE je rychlejší u velkých tabulek, protože neskenuje celou tabulku jako DELETE.
- Pokud potřebujete smazat pouze podmnožinu řádků na základě určitých kritérií, použijte příkaz DELETE.
Pro rychlý přehled základních SQL příkazů se můžete podívat na tento SQL cheat sheet.