ТРУНЦАТЕ вс. ДЕЛЕТЕ у СКЛ-у: Разумевање разлика

Научите како ТРУНЦАТЕ и ДЕЛЕТЕ изјаве функционишу у СКЛ-у, које су разлике између њих и када бисте више волели да користите један од другог.

Када радите са табелама базе података, можда ћете морати да избришете подскуп редова или све редове. Да бисте избрисали редове из табеле базе података, можете користити СКЛ ТРУНЦАТЕ или ДЕЛЕТЕ наредбе у зависности од случаја употребе.

У овом водичу ћемо детаљније погледати сваку од наредби, разумети како оне функционишу и одлучити када ћемо радије користити ТРУНЦАТЕ у односу на ДЕЛЕТЕ и обрнуто.

Пре него што наставимо даље, корисно је прегледати следеће СКЛ подскупове:

  • Изрази језика дефиниције података (ДДЛ) се користе за креирање и управљање објектима базе података као што су табеле. СКЛ ЦРЕАТЕ, ДРОП и ТРУНЦАТЕ изрази су примери ДДЛ наредби.
  • Изрази језика за манипулацију подацима (ДМЛ) се користе за манипулацију подацима унутар објеката базе података. ДМЛ изрази се користе за обављање операција креирања, читања, ажурирања и брисања записа.
  • Наредбе Дата Куери Лангуаге (ДКЛ) се користе за преузимање података из табела базе података. Све СЕЛЕЦТ изјаве потпадају под ДКЛ подскуп.

Како се користи СКЛ ТРУНЦАТЕ изјава

Синтакса СКЛ ТРУНЦАТЕ изјаве

Синтакса за коришћење СКЛ ТРУНЦАТЕ израза је следећа:

TRUNCATE TABLE table_name;

Извођење горње ТРУНЦАТЕ команде брише све редове у табели које је специфицирано име_табеле—и не брише табелу.

Операција скраћивања не скенира све записе у табели. Дакле, прилично је брже када радите са великим табелама базе података.

Пример употребе СКЛ ТРУНЦАТЕ

📑 Напомена: Ако јесте МиСКЛ инсталиран на вашој машини, можете да кодирате помоћу МиСКЛ клијента командне линије. Такође можете пратити у другом ДБМС-у по вашем избору, као што је ПостгреСКЛ.

Хајде да прво направимо базу података за рад:

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

Затим изаберите базу података коју смо управо креирали:

mysql> use db1;
Database changed

Следећи корак је креирање табеле базе података. Покрените следећу изјаву ЦРЕАТЕ ТАБЛЕ да бисте креирали табелу једноставних задатака:

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

У овом примеру, табела задатака има следеће колоне:

  • таск_ид: Јединствени идентификатор који се аутоматски повећава за сваки задатак.
  • титле: Наслов или назив задатка, ограничен на 255 знакова.
  • дуе_дате: Рок за задатак, представљен као датум.
  • статус: Статус задатка, који може бити ‘На чекању’, ‘У току’ или ‘Завршен’. Подразумевана вредност је постављена на „На чекању“.
  • ассигнее: Прималац за одређени задатак.
  Шта је Дуолинго и како Дуолинго функционише? Савети и Трикови

Сада када смо креирали табелу задатака, убацимо записе у њу:

-- 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');

Када покренете наредбу за уметање, требало би да видите сличан излаз:

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

Сада покрените команду ТРУНЦАТЕ табле да бисте избрисали све записе из табеле задатака:

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

На тај начин уклањају се сви записи, а не табела. Ово можете проверити покретањем СХОВ ТАБЛЕС; овако:

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

А СЕЛЕЦТ упит за преузимање података из табеле задатака враћа празан скуп:

SELECT * FROM tasks;
Empty set (0.00 sec)

Како се користи СКЛ ДЕЛЕТЕ изјава

Синтакса СКЛ ДЕЛЕТЕ изјаве

Општа синтакса за коришћење СКЛ ДЕЛЕТЕ наредбе је следећа:

DELETE FROM table_name 
WHERE condition;

Услов у клаузули ВХЕРЕ је предикат који одређује који од редова треба обрисати. Наредба ДЕЛЕТЕ брише све редове за које је предикат Тачан.

  Како да видите шта неко други воли на Инстаграму

Изјава ДЕЛЕТЕ вам, дакле, омогућава да имате већу контролу над тим који од записа ће бити обрисани.

Али шта се дешава када користите наредбу ДЕЛЕТЕ без клаузуле ВХЕРЕ?🤔

DELETE FROM table_name;

Извођење наредбе ДЕЛЕТЕ као што је приказано брише све редове у табели базе података.

Ако је изјава ДЕЛЕТЕ или скуп наредби ДЕЛЕТЕ део неповезане трансакције, можете да вратите промене. Међутим, препоручује се да направите резервну копију података на другом месту.

Пример употребе СКЛ ДЕЛЕТЕ

Сада да видимо СКЛ наредбу за брисање у акцији.

Избрисали смо све записе из табеле задатака. Дакле, можете поново да покренете ИНСЕРТ наредбу (коју смо покренули раније) да бисте уметнули записе:

-- 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');

Прво употребимо наредбу ДЕЛЕТЕ са клаузулом ВХЕРЕ. Следећи упит брише све редове за које је статус „Завршено“:

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

Сада покрените овај СЕЛЕЦТ упит:

SELECT * FROM tasks;

Видећете да тренутно има 14 редова:

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

Покретањем следеће изјаве ДЕЛЕТЕ бришете свих преосталих 14 записа у табели:

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

А табела задатака је сада празна:

SELECT * FROM tasks;
Empty set (0.00 sec)

СКЛ ДРОП изјава

До сада смо научили:

  • Наредба ТРУНЦАТЕ брише све редове из табеле.
  • Наредба ДЕЛЕТЕ—без клаузуле ВХЕРЕ—брише све записе из табеле.
  Шта се дешава са подацима са Фејсбука, Твитера и Гугла када умрете?

Међутим, изрази ТРУНЦАТЕ и ДЕЛЕТЕ не бришу табелу. Ако желите да избришете табелу из базе података, можете користити команду ДРОП ТАБЛЕ на следећи начин:

DROP TABLE table_name;

Сада избришемо табелу задатака из базе података:

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

Видећете да ПРИКАЖИ ТАБЕЛЕ; враћа празан скуп (пошто смо избрисали једину табелу која је била присутна у бази података):

mysql> SHOW TABLES;
Empty set (0.00 sec)

Када користити ТРУНЦАТЕ у односу на ДЕЛЕТЕ у СКЛ-у

ФеатуреТРУНЦАТЕДЕЛЕТЕСинтакТРУНЦАТЕ ТАБЛЕ име_табеле;Са клаузулом ВХЕРЕ: услов ДЕЛЕТЕ ФРОМ име_табеле ВХЕРЕ;
Без клаузуле ВХЕРЕ: ДЕЛЕТЕ ТАБЛЕ име_табеле; Дефиницијски језик СКЛ СубсетДата (ДДЛ) Језик за манипулацију подацима (ДМЛ) Ефекат Брише све редове у табели базе података. Када се покрене без клаузуле ВХЕРЕ, наредба ДЕЛЕТЕ брише све записе у табели базе података. ПерформанцеМоре ефикасан од наредбе ДЕЛЕТЕ када се ради са великим табелама.Мање ефикасан од наредбе ТРУНЦАТЕ.

Да сумирам:

  • Када треба да избришете све редове из велике табеле базе података, користите наредбу ТРУНЦАТЕ.
  • Да бисте избрисали подскуп редова на основу специфичних услова, користите наредбу ДЕЛЕТЕ.

Сумирајући

Хајде да завршимо нашу дискусију са резимеом:

  • Када радите са табелама базе података, можда ћете желети да уклоните подскуп редова или све редове у одређеној табели. Да бисте то урадили, можете користити наредбе ТРУНЦАТЕ или ДЕЛЕТЕ.
  • Наредба ТРУНЦАТЕ узима синтаксу: ТРУНЦАТЕ ТАБЛЕ име_табеле;. Брише све редове у табели специфициране са табле_наме, али не брише саму табелу.
  • Наредба ДЕЛЕТЕ узима синтаксу: ДЕЛЕТЕ ФРОМ табле_наме ВХЕРЕ услов;. Ово уклања редове за које је услов предиката тачан.
  • Извођење СКЛ ДЕЛЕТЕ наредбе без клаузуле ВХЕРЕ брише све редове у табели. Дакле, функционално, ово постиже исти резултат као СКЛ ТРУНЦАТЕ израз.
  • Покретање ТРУНЦАТЕ је посебно брже када се ради са већим табелама, јер не скенира целу табелу. Дакле, када требате да избришете све редове у великој табели базе података, покретање трунцате може бити ефикасније.
  • Када треба да избришете подскуп редова — на основу одређеног услова — можете користити СКЛ ДЕЛЕТЕ наредбу.

За брзи преглед најчешће коришћених СКЛ команди, погледајте ову СКЛ шифру.