TRUNCATE vs. DELETE v SQL: Pochopení rozdílů

Zjistěte, jak fungují příkazy TRUNCATE a DELETE v SQL, jaké jsou mezi nimi rozdíly a kdy byste měli preferovat použití jednoho před druhým.

Při práci s databázovými tabulkami možná budete muset odstranit podmnožinu řádků nebo všechny řádky. Chcete-li odstranit řádky z databázové tabulky, můžete v závislosti na případu použití použít příkazy SQL TRUNCATE nebo DELETE.

V tomto tutoriálu se blíže podíváme na každý z příkazů, pochopíme, jak fungují, a rozhodneme se, kdy upřednostnit použití TRUNCATE před DELETE a naopak.

Než půjdeme dále, je užitečné zkontrolovat následující podmnožiny SQL:

  • Příkazy DDL (Data Definition Language) se používají k vytváření a správě databázových objektů, jako jsou tabulky. Příkazy SQL CREATE, DROP a TRUNCATE jsou příklady příkazů DDL.
  • Příkazy jazyka DML (Data Manipulation Language) se používají k manipulaci s daty v databázových objektech. Příkazy DML se používají k provádění operací vytváření, čtení, aktualizace a mazání záznamů.
  • Příkazy Data Query Language (DQL) se používají k načítání dat z databázových tabulek. Všechny příkazy SELECT spadají do podmnožiny DQL.

Jak používat příkaz SQL TRUNCATE

Syntaxe příkazu SQL TRUNCATE

Syntaxe pro použití příkazu SQL TRUNCATE je následující:

TRUNCATE TABLE table_name;

Spuštěním výše uvedeného příkazu TRUNCATE se odstraní všechny řádky v tabulce určené parametrem název_tabulky – a neodstraní se tabulka.

Operace zkrácení neprohledá všechny záznamy v tabulce. Při práci s velkými databázovými tabulkami je tedy přiměřeně rychlejší.

Příklad použití SQL TRUNCATE

📑 Poznámka: Pokud máte MySQL nainstalovaný na vašem počítači, můžete kódovat pomocí klienta příkazového řádku MySQL. Můžete také sledovat v jiném DBMS dle vašeho výběru, jako je např PostgreSQL.

Nejprve vytvoříme databázi, se kterou budeme pracovat:

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

Poté vyberte databázi, kterou jsme právě vytvořili:

mysql> use db1;
Database changed

Dalším krokem je vytvoření databázové tabulky. Spuštěním následujícího příkazu CREATE TABLE vytvořte jednoduchou tabulku úloh:

-- 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 tomto příkladu má tabulka úkolů následující sloupce:

  • task_id: Automaticky se zvyšující jedinečný identifikátor pro každý úkol.
  • title: Název nebo název úkolu, omezený na 255 znaků.
  • due_date: Datum dokončení úkolu, reprezentované jako datum.
  • stav: Stav úkolu, který může být ‚Nevyřízeno‘, ‚Probíhá‘ nebo ‚Dokončeno‘. Výchozí hodnota je nastavena na „Nevyřízeno“.
  • zmocněnec: zmocněnec pro konkrétní úkol.
  Jak se můžete přihlásit do Hulu na Roku

Nyní, když jsme vytvořili tabulku úkolů, vložíme do ní záznamy:

-- 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 spuštění příkazu insert byste měli vidět podobný výstup:

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

Nyní spusťte příkaz TRUNCATE table a odstraňte všechny záznamy z tabulky úloh:

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

Pokud tak učiníte, odstraní se všechny záznamy, nikoli tabulka. Můžete to ověřit spuštěním SHOW TABLES; jako tak:

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

A dotaz SELECT pro načtení dat z tabulky úloh vrátí prázdnou sadu:

SELECT * FROM tasks;
Empty set (0.00 sec)

Jak používat příkaz SQL DELETE

Syntaxe příkazu SQL DELETE

Obecná syntaxe pro použití příkazu SQL DELETE je následující:

DELETE FROM table_name 
WHERE condition;

Podmínka v klauzuli WHERE je predikát, který určuje, který z řádků by měl být odstraněn. Příkaz DELETE odstraní všechny řádky, pro které má predikát hodnotu True.

  Jak zobrazit staré příběhy Instagramu

Příkaz DELETE vám tedy umožňuje mít větší kontrolu nad tím, které záznamy budou odstraněny.

Co se ale stane, když použijete příkaz DELETE bez klauzule WHERE?🤔

DELETE FROM table_name;

Spuštěním příkazu DELETE podle obrázku odstraníte všechny řádky v tabulce databáze.

Pokud je příkaz DELETE nebo sada příkazů DELETE součástí nepotvrzené transakce, můžete změny vrátit zpět. Doporučuje se však mít data zálohovaná jinde.

Příklad použití SQL DELETE

Nyní se podívejme na příkaz SQL delete v akci.

Smazali jsme všechny záznamy z tabulky úkolů. Takže můžete znovu spustit příkaz INSERT (který jsme spustili dříve) a vložit záznamy:

-- 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í dotaz odstraní všechny řádky, u kterých je stav ‚Dokončeno‘:

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

Nyní spusťte tento SELECT dotaz:

SELECT * FROM tasks;

Uvidíte, že aktuálně existuje 14 řádků:

+---------+---------+------------+-------------+----------+
| 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)

Spuštěním následujícího příkazu DELETE odstraníte všech zbývajících 14 záznamů v tabulce:

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

A tabulka úkolů je nyní prázdná:

SELECT * FROM tasks;
Empty set (0.00 sec)

Příkaz SQL DROP

Zatím jsme se naučili:

  • Příkaz TRUNCATE odstraní všechny řádky z tabulky.
  • Příkaz DELETE – bez klauzule WHERE – odstraní všechny záznamy z tabulky.
  Jak zpětně vyhledat video

Příkazy TRUNCATE a DELETE však tabulku neodstraní. Pokud chcete odstranit tabulku z databáze, můžete použít příkaz DROP TABLE takto:

DROP TABLE table_name;

Nyní odstraníme tabulku úkolů z databáze:

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

Uvidíte, že ZOBRAZIT TABULKY; vrátí prázdnou sadu (protože jsme smazali jedinou tabulku, která byla v databázi):

mysql> SHOW TABLES;
Empty set (0.00 sec)

Kdy použít TRUNCATE vs. DELETE v SQL

FeatureTRUNCATEDELETESyntaxTRUNCATE TABLE název_tabulky;S klauzulí WHERE: DELETE FROM název_tabulky WHERE podmínka;
Bez klauzule WHERE: DELETE TABLE název_tabulky;SQL SubsetData Definition Language (DDL)Jazyk pro manipulaci s daty (DML)Effect Smaže všechny řádky v databázové tabulce.Při spuštění bez klauzule WHERE příkaz DELETE odstraní všechny záznamy v databázové tabulce.PerformanceMore efektivnější než příkaz DELETE při práci s velkými tabulkami.Méně účinný než příkaz TRUNCATE.

Abych to shrnul:

  • Pokud potřebujete odstranit všechny řádky z velké databázové tabulky, použijte příkaz TRUNCATE.
  • Chcete-li odstranit podmnožinu řádků na základě určitých podmínek, použijte příkaz DELETE.

Shrnutí

Uzavřeme naši diskusi shrnutím:

  • Při práci s databázovými tabulkami můžete chtít odstranit podmnožinu řádků nebo všechny řádky v konkrétní tabulce. K tomu můžete použít příkazy TRUNCATE nebo DELETE.
  • Příkaz TRUNCATE má syntaxi: TRUNCATE TABLE název_tabulky;. Odstraní všechny řádky v tabulce určené parametrem název_tabulky, ale neodstraní samotnou tabulku.
  • Příkaz DELETE má syntaxi: DELETE FROM název_tabulky WHERE podmínka;. Tím se odstraní řádky, pro které platí podmínka predikátu.
  • Spuštění příkazu SQL DELETE bez klauzule WHERE odstraní všechny řádky v tabulce. Funkčně to tedy dosahuje stejného výsledku jako příkaz SQL TRUNCATE.
  • Spuštění TRUNCATE je rychlejší zejména při práci s většími tabulkami, protože neskenuje celou tabulku. Takže když potřebujete odstranit všechny řádky ve velké databázové tabulce, spuštění zkrácení může být efektivnější.
  • Když potřebujete odstranit podmnožinu řádků – na základě konkrétní podmínky – můžete použít příkaz SQL DELETE.

Pro rychlý přehled běžně používaných SQL příkazů se podívejte na tento SQL cheat sheet.