Lär dig hur TRUNCATE- och DELETE-satserna fungerar i SQL, skillnaderna mellan dem och när du föredrar att använda den ena framför den andra.
När du arbetar med databastabeller kan du behöva ta bort en delmängd av rader eller alla rader. För att ta bort rader från en databastabell kan du använda SQL TRUNCATE eller DELETE-satserna beroende på användningsfallet.
I den här handledningen kommer vi att titta närmare på vart och ett av påståendena, förstå hur de fungerar och bestämma när vi föredrar att använda TRUNCATE framför DELETE och vice versa.
Innan vi går vidare är det bra att granska följande SQL-underuppsättningar:
- Data Definition Language (DDL)-satser används för att skapa och hantera databasobjekt såsom tabeller. SQL-satserna CREATE, DROP och TRUNCATE är exempel på DDL-satser.
- Data Manipulation Language (DML)-satser används för att manipulera data i databasobjekt. DML-satser används för att utföra operationerna för att skapa, läsa, uppdatera och ta bort poster.
- Data Query Language (DQL)-satser används för att hämta data från databastabeller. Alla SELECT-satser faller under DQL-delmängden.
Innehållsförteckning
Hur man använder SQL TRUNCATE-satsen
Syntax för SQL TRUNCATE-satsen
Syntaxen för att använda SQL TRUNCATE-satsen är följande:
TRUNCATE TABLE table_name;
Att köra ovanstående TRUNCATE-kommando raderar alla rader i tabellen som anges av tabellnamn – och tar inte bort tabellen.
Trunkeringsoperationen skannar inte alla poster i tabellen. Så det är rimligt snabbare när man arbetar med stora databastabeller.
SQL TRUNCATE Användningsexempel
📑 Obs: Om du har MySQL installerat på din maskin kan du koda med med MySQL-kommandoradsklienten. Du kan även följa med i ett annat DBMS som du väljer som t.ex PostgreSQL.
Låt oss först skapa en databas att arbeta med:
mysql> CREATE DATABASE db1; Query OK, 1 row affected (1.50 sec)
Välj sedan databasen som vi just skapade:
mysql> use db1; Database changed
Nästa steg är att skapa en databastabell. Kör följande CREATE TABLE-sats för att skapa en enkel uppgiftstabell:
-- 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) );
I det här exemplet har uppgiftstabellen följande kolumner:
- task_id: En automatiskt ökande unik identifierare för varje uppgift.
- title: Titeln eller namnet på uppgiften, begränsad till 255 tecken.
- förfallodatum: Förfallodatumet för uppgiften, representerat som ett datum.
- status: Statusen för uppgiften, som kan vara ”Pending”, ”Pågående” eller ”Completed”. Standardvärdet är inställt på ’Pending’.
- assignee: assignee för den specifika uppgiften.
Nu när vi har skapat uppgiftstabellen, låt oss infoga poster i den:
-- 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');
När du kör insert-satsen bör du se en liknande utdata:
Query OK, 20 rows affected (0.18 sec) Records: 20 Duplicates: 0 Warnings: 0
Kör nu kommandot TRUNCATE table för att ta bort alla poster från uppgiftstabellen:
TRUNCATE TABLE tasks; Query OK, 0 rows affected (0.72 sec)
Om du gör det tas alla poster bort och inte tabellen. Du kan verifiera detta genom att köra SHOW TABLES; såhär:
SHOW TABLES;
+---------------+ | Tables_in_db1 | +---------------+ | tasks | +---------------+ 1 row in set (0.00 sec)
Och en SELECT-fråga för att hämta data från uppgiftstabellen returnerar en tom uppsättning:
SELECT * FROM tasks; Empty set (0.00 sec)
Hur man använder SQL DELETE-satsen
Syntax för SQL DELETE-satsen
Den allmänna syntaxen för att använda SQL DELETE-satsen är följande:
DELETE FROM table_name WHERE condition;
Villkoret i WHERE-satsen är predikatet som bestämmer vilken av raderna som ska tas bort. DELETE-satsen tar bort alla rader för vilka predikatet är True.
DELETE-satsen låter dig därför ha mer kontroll över vilka av posterna som raderas.
Men vad händer när du använder DELETE-satsen utan WHERE-satsen?🤔
DELETE FROM table_name;
Att köra DELETE-satsen som visas tar bort alla rader i databastabellen.
Om en DELETE-sats eller en uppsättning DELETE-satser är en del av en ej genomförd transaktion kan du återställa ändringarna. Det rekommenderas dock att säkerhetskopiera dina data någon annanstans.
SQL DELETE Användningsexempel
Låt oss nu se SQL delete-satsen i aktion.
Vi har tagit bort alla poster från uppgiftstabellen. Så du kan köra INSERT-satsen igen (som vi körde tidigare) för att infoga poster:
-- 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');
Låt oss först använda DELETE-satsen med WHERE-satsen. Följande fråga tar bort alla rader för vilka statusen är ”Slutförd”:
DELETE FROM tasks WHERE status="Completed"; Query OK, 6 rows affected (0.14 sec)
Kör nu denna SELECT-fråga:
SELECT * FROM tasks;
Du kommer att se att det finns 14 rader för närvarande:
+---------+---------+------------+-------------+----------+ | 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)
Om du kör följande DELETE-sats raderas alla återstående 14 poster i tabellen:
DELETE FROM tasks; Query OK, 14 rows affected (0.20 sec)
Och uppgiftstabellen är nu tom:
SELECT * FROM tasks; Empty set (0.00 sec)
SQL DROP-satsen
Hittills har vi lärt oss:
- TRUNCATE-satsen tar bort alla rader från tabellen.
- DELETE-satsen—utan en WHERE-sats—tar bort alla poster från tabellen.
Men TRUNCATE- och DELETE-satserna tar inte bort tabellen. Om du vill ta bort tabellen från databasen kan du använda kommandot DROP TABLE så här:
DROP TABLE table_name;
Låt oss nu ta bort uppgiftstabellen från databasen:
mysql> DROP TABLE tasks; Query OK, 0 rows affected (0.43 sec)
Du kommer att se att VISA TABELLER; returnerar en tom uppsättning (eftersom vi har tagit bort den enda tabellen som fanns i databasen):
mysql> SHOW TABLES; Empty set (0.00 sec)
När ska man använda TRUNCATE vs. DELETE i SQL
FeatureTRUNCATEDELETESyntaxTRUNCATE TABLE tabellnamn;Med WHERE-sats: DELETE FROM tabellnamn WHERE-villkor;
Utan WHERE-sats: DELETE TABLE tabellnamn;SQL SubsetData definition language (DDL)Datamanipulationsspråk (DML)Effect Tar bort alla rader i databastabellen. När den körs utan WHERE-satsen raderar DELETE-satsen alla poster i databastabellen.PerformanceMer effektiv än DELETE-satsen när du arbetar med stora tabeller. Mindre effektiv än TRUNCATE-satsen.
För att sammanfatta:
- När du behöver ta bort alla rader från en stor databastabell, använd TRUNCATE-satsen.
- För att ta bort en delmängd av raderna baserat på specifika villkor, använd DELETE-satsen.
Summering
Låt oss avsluta vår diskussion med en sammanfattning:
- När du arbetar med databastabeller kanske du vill ta bort delmängden av rader eller alla rader i en viss tabell. För att göra det kan du använda TRUNCATE eller DELETE-satserna.
- TRUNCATE-satsen tar syntaxen: TRUNCATE TABLE tabellnamn;. Den tar bort alla rader i tabellen som anges av tabellnamn men tar inte bort själva tabellen.
- DELETE-satsen tar syntaxen: DELETE FROM tabellnamn WHERE-villkor;. Detta tar bort raderna för vilka predikatvillkoret är sant.
- Om du kör SQL DELETE-satsen utan WHERE-satsen raderas alla rader i tabellen. Så funktionellt uppnår detta samma resultat som SQL TRUNCATE-satsen.
- Att köra TRUNCATE är särskilt snabbare när man arbetar med större tabeller, eftersom det inte skannar hela tabellen. Så när du behöver ta bort alla rader i en stor databastabell kan det vara mer effektivt att köra trunkering.
- När du behöver ta bort en delmängd av rader – baserat på ett specifikt villkor – kan du använda SQL DELETE-satsen.
För en snabb genomgång av vanliga SQL-kommandon, kolla in detta SQL-fuskblad.